NRVO案例中const返回类型的相关性

时间:2012-06-08 07:58:14

标签: c++

这是来自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,在返回步骤期间不会创建临时表。要返回的对象直接构造在被调用者的地址上。

3 个答案:

答案 0 :(得分:8)

这是一个更好的例子:

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

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

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

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

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

答案 1 :(得分:4)

有些人过去常常建议这样做,以防止像A + B = C那样写废话。但是,在C ++ 11中,它可以防止一些优化,因为它使返回值不可移动。因此,你不应该这样做。

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

答案 2 :(得分:3)

您的代码段中没有任何相关性,因为您正在对返回的值进行复制

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

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

因此,如果您想禁止在临时对象上调用非const方法,则应该只使用它。另一方面,它会杀死C ++ 11中的move-semantics,所以不鼓励。