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