有人可以解释为什么移动赋值运算符(通常)声明为
Foo& operator=(Foo&&);
为什么要返回参考而不是Foo
或Foo&&
?我理解为什么我们希望这个用于常规赋值运算符,因为关联性规则(a=b)=c
在逻辑上被破坏(尽管仍然可编译),如果没有通过引用返回,但为什么这是RHS是rvalue的情况(xvalue) / prvalue)?
答案 0 :(得分:4)
返回Foo
可能很昂贵,如果类型不可复制,则无法返回。这也是令人惊讶的:(a=b)=c
会创建一个临时的,并为此分配c
,当您希望这两项作业都是a
时。
返回Foo&&
只是奇怪;你不希望事情神秘地变成 rvalues ,以便例如f(a=b)
意外地从a
移出而没有你告诉它。
返回Foo&
是一种传统的方法,如果你将它链接起来,操作员的表现就不会令人惊讶了。