【发布时间】:2018-04-13 03:51:33
【问题描述】:
在 C++11 中,如果我们进行以下定义,我们会从编译器 (g++) 中得到一个歧义错误:
C& operator=(C rhs)
{
swap(*this, rhs);
return *this;
}
C& operator=(C&& rhs)
{
swap(*this, rhs);
return *this;
}
我并不完全清楚为什么会有歧义。据我了解,编译器可以在编译时区分什么是右值对象,什么不是。因此它可以决定为右值对象调用后者,为左值对象调用前者。我可能遗漏了一些基本的东西,但解释一下会很好。
【问题讨论】:
-
&&变体在这里有什么好处?它通常不是copy-and-swap idiom 的一部分,是吗? -
&& 变体将允许执行 c1 = c2 + c3 而无需将 c2 + c3 额外复制到 rhs。
-
你是对的,第一个会有额外的移动,但我见过的大多数 C++11 implementations of the copy-and-swap idiom 表明你应该使用
C选项,或者如果你想要优化,@987654327 @ 和C&&正常。答案here 表示C和C&&对于重载是模棱两可的
标签: c++11 move-semantics rvalue