【发布时间】:2015-05-31 06:12:57
【问题描述】:
有人可以解释为什么移动赋值运算符(通常)被声明为
Foo& operator=(Foo&&);
为什么返回引用而不是例如Foo 还是 Foo&&?我理解为什么我们希望常规赋值运算符使用这个,因为(a=b)=c 的关联规则在逻辑上被破坏(尽管仍然可编译)如果不是通过引用返回,但是为什么当 RHS 是右值(xvalue/prvalue)时会出现这种情况)?
【问题讨论】:
-
完全不清楚你在问什么。除非通过引用,否则您不能返回“对象本身”。如果您的意思是“为什么不返回对象的副本”,那么只有在类型是可复制的情况下才有效,即使这样复制也可能比您想要的更昂贵。
(a=b)=c要求第一个表达式(a=b)是一个 lvalue 无论赋值运算符的参数类型如何,因此如果你想支持它,你必须返回一个引用。 -
@MikeSeymour 我改变了问题,为什么不直接返回
Foo?甚至Foo&&?哪些“链式”规则将被打破? -
返回
Foo可能很昂贵,如果类型不可复制,则不可能,正如我所说。返回Foo&&很奇怪;你不希望事情神秘地变成 rvalues 以便例如f(a=b)出人意料地从a移动,而你没有告诉它。 -
@MikeSeymour 谢谢,这一点很好,你应该发布(如果你想)一个答案,因为我认为这个问题不是很明显,尽管现在它很有意义。
-
另一种看待它的方式。如果你想要的只是一个右值并且你可以做一个复制,你总是可以做
Foo&& x = Foo(y);这在我看来与 y 上的移动操作符相同,所以在这种情况下移动操作符将是多余的在复制构造函数之上。
标签: c++ c++11 move-semantics