使 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=].