常量返回类型在 NRVO 案例中的相关性

Relevance of const return type in NRVO cases

本文关键字:相关性 案例 NRVO 返回类型 常量      更新时间:2023-10-16

这是在返回语句中调用构造函数的后续问题。

这是一个操作员在课堂上超载的乐趣。

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,在返回步骤中不会创建临时工。要返回的对象直接构造在被调用方的地址上。

下面是一个更好的示例:

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

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

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

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

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

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

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

代码片段中没有相关性,因为您正在创建返回值的副本。

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

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

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