使 return 值常量如何影响移动语义?
How does making a return value const affect move semantics?
例如:
class Rational
{
public:
const Rational operator*(Rational){ return Rational(); }
}
回答中提到了它,但没有解释它实际上是如何影响移动语义的。不能举个例子吗?
考虑一下:
Rational a, b, c;
a = b*c;
如果operator*
return是非常量Rational
,那么b*c
的return值可以移动 变为 a
,因为值不是 const
,可以修改。将调用移动赋值运算符 operator=(Rational&&)
。
如果operator*
returns const Rational
,那么b*c
的return值不能移动变成a
,因为值为const
,不能修改;相反,它必须 复制 到 a
。将调用复制赋值运算符 operator=(const Rational&)
。
如果 Rational
复制起来很昂贵但移动起来很便宜,那么 returning a const Rational
因此比 returning a non-const [=] 效率低12=].
例如:
class Rational
{
public:
const Rational operator*(Rational){ return Rational(); }
}
考虑一下:
Rational a, b, c;
a = b*c;
如果operator*
return是非常量Rational
,那么b*c
的return值可以移动 变为 a
,因为值不是 const
,可以修改。将调用移动赋值运算符 operator=(Rational&&)
。
如果operator*
returns const Rational
,那么b*c
的return值不能移动变成a
,因为值为const
,不能修改;相反,它必须 复制 到 a
。将调用复制赋值运算符 operator=(const Rational&)
。
如果 Rational
复制起来很昂贵但移动起来很便宜,那么 returning a const Rational
因此比 returning a non-const [=] 效率低12=].