为啥我的返回类型没有意义?
Posted
技术标签:
【中文标题】为啥我的返回类型没有意义?【英文标题】:Why is my return type meaningless?为什么我的返回类型没有意义? 【发布时间】:2009-03-26 16:19:04 【问题描述】:我正在尝试使用const MyClass * const
的返回类型。但是,我收到警告:
警告:#815-D:返回类型的类型限定符没有意义。
这不是有效的类型吗?我想要一个不能更改的指针,并且我希望它指向的东西也不能更改。
【问题讨论】:
您使用的是哪个编译器和编译标志? RVCT 3.1 我不知道构建系统标志的胆量对我们这些凡人隐藏了哪些标志 【参考方案1】:指针本身具有值类型,因此将其设为 const 是没有意义的。调用函数对返回值的处理不受被调用函数的限制。这类似于尝试定义如下内容:
const int getInt();
getInt(),在这种情况下,只返回一个 int 值(不是引用)。它进入一个寄存器,然后调用函数接收它并用它做任何事情。
【讨论】:
所以基本上你只能定义带有引用的 const 返回类型? 是(通过引用,表示引用和指向对象)。指针本身不能是 const,它只是一个复制过来的值。 从函数返回时指针不能为 const,但您可以在调用站点有一个 const 指针(请参阅下面的答案)。这可以防止有人在您实际使用指针时无意中重新分配给指针。【参考方案2】:我同意 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();
【讨论】:
【参考方案3】:为什么要关心指针是否改变?这样做就像在说:
const int f()
...
f() 返回的值是一个副本 - 更改它不会改变任何内容,因此将其设为 const 没有任何意义。
【讨论】:
我在想我不希望人们做类似指针++的事情,因为每个单独对象的大小都不一样。 @Dynite,这就像给人们你的地址,例如大街 80 号,然后想知道如果他们在大街 81 号按铃会发生什么。 @Dynite - 正如丹尼尔指出的那样,他们无论如何都可以做到,所以除了一些额外的键盘练习之外,你什么也得不到 @Dynite:他们可以通过*(pointer+1)
做到这一点,而不会抛弃 constness 或其他丑陋,因此您购买的安全性确实并不多。
如果你想阻止指针++,试着给他们一个引用,或者一些自定义指针类型,指针++要么不能编译,要么做预期的事情。【参考方案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
这应该有助于确保您的返回类型不再毫无意义:)
【讨论】:
来自问题:“指针比不能改变,而且......它指向的东西也不能改变。”他根据自己的意图正确地声明了返回类型。 是的,他做到了。而且他只收到一个编译器警告,说这些东西在返回值上毫无意义。【参考方案5】:const 限定符没有任何意义,因为你返回的是一个指针
【讨论】:
【参考方案6】:为什么要返回一个常量值?考虑以下内容(请原谅没有想象力的变量名称):
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);
没错,我刚刚分配给了operator+
返回的临时A
。 d.a
的结果值为 4,而不是 5。将 operator+
的返回类型更改为 const A
会阻止此赋值,从而导致表达式 (a+b) = c
生成编译器错误。
如果我尝试分配从函数返回的指针或整数,我的编译器 (MSVC) 会生成“左操作数必须是左值”错误,这似乎与 ARM 编译器告诉您指针是没有意义的——无论如何都不能分配指针。但是对于类/结构,显然可以分配给非常量返回值。
【讨论】:
以上是关于为啥我的返回类型没有意义?的主要内容,如果未能解决你的问题,请参考以下文章