11

我正在尝试使用const MyClass * const. 但是,我收到警告:

警告:#815-D:返回类型的类型限定符没有意义。

这不是有效类型吗?我想要一个无法更改的指针,并且我希望它指向的东西也不会被更改。

4

6 回答 6

23

指针本身具有值类型,因此将其设为 const 没有意义。调用函数对返回值的处理不受被调用函数的限制。这类似于尝试定义如下内容:

const int getInt();

在这种情况下,getInt() 只返回一个 int 值(不是引用)。它进入一个寄存器,然后调用函数接收它并用它做任何它想做的事情。

于 2009-03-26T16:23:15.900 回答
5

我同意 Juliano 的回答,您希望指针的常量位于调用站点。

做你正在寻找的更好的方法是让你的函数返回一个对对象的 const 引用:

const MyClass& getMyClass()
{ 
  return myClass;
}

根据定义,引用不能被修改,所以你会更好。

当然,如果您的函数试图创建MyClass 对象,这将不起作用。在这种情况下,您只需将额外的 const 移动到调用站点。

// function definition
const MyClass* createMyClass()
{ 
  return new MyClass("I Love C++");
}

// use of a const pointer to a MyClass which is const
const MyClass* const myClassInstance = creatMyClass();
于 2009-03-26T16:35:18.897 回答
4

你为什么关心指针是否改变?这样做就像在说:

const int f() {
   ...
}

f() 返回的值是一个副本 - 更改它不会改变任何内容,因此将其设为 const 没有意义。

于 2009-03-26T16:24:35.180 回答
4

确保定义所需返回类型的一种简单方法是始终在原始类型的右侧(而不是左侧)添加修饰符。

MyClass                 // MyClass object
MyClass const           // MyClass object which can't be modified
MyClass const &         // reference of an unmodifiable MyClass object 
MyClass const *         // pointer to an unmodifiable MyClass object
MyClass const * const   // unmodifiable pointer to an unmodifiable MyClass object
MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object

这应该有助于确保您的返回类型不再毫无意义:)

于 2009-03-26T16:34:13.627 回答
0

const 限定符没有任何意义,因为您正在返回一个指针

于 2009-03-26T16:23:10.940 回答
0

为什么要返回一个常量值?考虑以下内容(请原谅缺乏想象力的变量名称):

struct A { int a; };

A operator+(const A& a1, const A& a2) 
{
    A a3 = { a1.a + a2.a };
    return a3;
}

鉴于 的声明operator+,我可以执行以下操作:

A a = {2}, b = {3}, c = {4}, d = ((a+b) = c);

没错,我只是分配给了Aoperator+. 的结果值为d.a4,而不是 5。更改返回类型operator+const A阻止此赋值,从而导致表达式(a+b) = c生成编译器错误。

如果我尝试分配从函数返回的指针或整数,我的编译器 (MSVC) 会生成“左操作数必须是左值”错误,这似乎与 ARM 编译器告诉您指针的 constness 没有意义--无论如何都不能分配指针。但是对于类/结构,显然可以分配给非常量返回值。

于 2009-03-27T05:54:56.167 回答