如何使返回值const影响移动语义?

St.*_*rio 2 c++ move-semantics

例如:

class Rational
{
public: 
    const Rational operator*(Rational){ return Rational(); }
}
Run Code Online (Sandbox Code Playgroud)

这个答案中提到了它,但它没有解释它实际上如何影响移动语义.你不能举一些例子吗?

Bri*_*ian 6

考虑一下:

Rational a, b, c;
a = b*c;
Run Code Online (Sandbox Code Playgroud)

如果operator*返回一个非const Rational,则返回值b*c可以被移动a,因为该值不是const并且可以被修改.operator=(Rational&&)将调用移动赋值运算符.

如果operator*返回const Rational,则返回值b*c不能被移动a,因为该值const,不能被修改; 相反,它必须被复制a.operator=(const Rational&)将调用复制赋值运算符.

如果Rational复制昂贵但移动成本低,那么返回a const Rational比返回非const的效率低Rational.

  • **移动赋值**或**移动构造**需要将数据从源对象移动到目标对象中并**修改源对象**,因此它不再引用该数据.`const`对象不能被修改,因此不能被移动,只能从中复制. (3认同)