为什么移动赋值运算符应该 return 引用 *this

Why move assignment operator should return reference to *this

有人可以解释为什么移动赋值运算符(通常)声明为

Foo& operator=(Foo&&);

为什么 return 是参考而不是例如Foo 还是 Foo&&?我理解为什么我们想要常规赋值运算符,因为关联性规则 (a=b)=c 在逻辑上被破坏(尽管仍然可编译)如果不是 return 通过引用编辑,但为什么 RHS 时会出现这种情况是右值 (xvalue/prvalue)?

返回 Foo 可能代价高昂,如果类型不可复制则不可能。这也令人惊讶:(a=b)=c 会创建一个临时对象并将 c 分配给它,而您希望这两个分配都是 a.

返回 Foo&& 很奇怪;你不希望事情神秘地变成 rvalues 这样例如f(a=b) 在您未告知的情况下意外地从 a 移动。

返回 Foo& 是使运算符在链式操作时表现正常的传统方式。