为什么我的返回类型毫无意义?

时间:2009-03-26 16:19:04

标签: c++ const const-correctness

我正在尝试使用返回类型const MyClass * const。但是,我收到了警告:

  

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

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

6 个答案:

答案 0 :(得分:22)

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

const int getInt();

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

答案 1 :(得分: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();

答案 2 :(得分:4)

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

const int f() {
   ...
}

f()返回的值是一个副本 - 更改它不会改变任何内容,因此有一个nom点使它成为const。

答案 3 :(得分: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

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

答案 4 :(得分:0)

const限定符并不意味着什么,因为你正在返回一个指针

答案 5 :(得分:0)

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

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);

没错,我刚刚分配到A返回的临时operator+。结果d.a的值为4,而不是5.将operator+的返回类型更改为const A会阻止此赋值,从而导致表达式(a+b) = c生成编译器错误。< / p>

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