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

hac*_*ock 3 c++

这是来自return语句中的Calling构造函数的后续问题.

这是一个操作员在课堂上过载的乐趣.

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

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) {}
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 8

这是一个更好的例子:

struct Foo
{
    void gizmo();
    Foo const operator+(Foo const & rhs);
};
Run Code Online (Sandbox Code Playgroud)

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

(x + y).gizmo();  // error!
Run Code Online (Sandbox Code Playgroud)

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

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

  • @rocky如果你想阻止在temporaries上调用非const你实际上没有选择,那只是意味着如果适用的话你不会从移动语义中受益. (2认同)