【问题标题】:Why is my return type meaningless?为什么我的返回类型没有意义?
【发布时间】:2009-03-26 16:19:04
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的是哪个编译器和编译标志?
  • RVCT 3.1 我不知道构建系统标志的胆量对我们这些凡人隐藏了哪些标志

标签: c++ constants const-correctness


【解决方案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 编译器告诉您指针是没有意义的——无论如何都不能分配指针。但是对于类/结构,显然可以分配给非常量返回值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 2013-02-18
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        相关资源
        最近更新 更多