3

这是Calling constructor in return statement的后续问题。

这是一个类中的运算符重载乐趣。

const Integer operator+(const Integer& IntObject)
{
    cout << "Data : " << this->data << endl;
    return Integer(this->data + IntObject.data); 
}

const 在此类函数的返回类型中的相关性是什么?

int main()
{
    Integer A(1); //Create 2 object of class Integer

    Integer B(2);

    const Integer C = A + B;  //This will work

    Integer D = A + B;        //This will also work

    fun(A + B);               //Will work
}

void fun(Integer F) {}

这是由于 NRVO 在返回步骤期间未创建临时对象的情况。要返回的对象是直接在被调用者的地址上构造的。

4

3 回答 3

8

这是一个更好的例子:

struct Foo
{
    void gizmo();
    Foo const operator+(Foo const & rhs);
};

现在,如果您有Foo x; Foo y;,那么您不能说:

(x + y).gizmo();  // error!

常量返回值意味着您不能将其用于非常量操作。对于原始类型,这不太相关,因为您可以在临时对象上执行的非常量操作并不多,因为临时对象上++不允许有很多“有趣的”操作(如 prefix- )。

也就是说,对于 C++11,人们应该真正尝试采用永不返回常量值的新习惯,因为非常量值现在可以进行移动优化。

于 2012-06-08T08:03:53.113 回答
4

有些人曾经建议这样做,以防止写诸如A + B = C. 但是,在 C++11 中,它可以防止一些优化,因为它使返回值不可移动。因此,您不应该这样做。

在这种情况下,它还会阻止您编写完全有效的代码,例如D = A + B + C,但这只是因为作者忘记声明 operator const

于 2012-06-08T08:05:41.273 回答
3

您的代码片段没有相关性,因为您正在制作返回值的副本

通常,很难找到返回const值的充分理由。我只能看到它在这种类型的表达式中产生影响,试图在const临时上调用非常量方法:

(someObject.someMethodReturningConstValue()).someNonConstMethod(); // error, calls non const method on const temporary

因此,仅当您想禁止在临时对象上调用非常量方法时才应使用它。另一方面,它杀死了 C++11 中的移动语义,因此不鼓励使用。

于 2012-06-08T08:02:09.493 回答