为啥我的返回类型没有意义?

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+返回的临时Ad.a 的结果值为 4,而不是 5。将 operator+ 的返回类型更改为 const A 会阻止此赋值,从而导致表达式 (a+b) = c 生成编译器错误。

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

【讨论】:

以上是关于为啥我的返回类型没有意义?的主要内容,如果未能解决你的问题,请参考以下文章

当一个函数无返回值时,函数的类型应定义为啥

打字稿。为啥功能接口中描述的“返回值”类型没有严格执行?

为啥我的查询没有返回枚举数组

R语言每次运行结果返回值的个数为啥不同

为啥没有为不同的返回类型定义方法重载?

当返回类型是表名时,为啥 PostgreSQL 函数返回空列而不是没有行?