在C ++ 11中,如果我们做出以下定义,我们会从编译器(g ++)中得到歧义错误:
C& operator=(C rhs)
{
swap(*this, rhs);
return *this;
}
C& operator=(C&& rhs)
{
swap(*this, rhs);
return *this;
}
我不清楚为什么会有歧义。根据我的理解,编译器可以区分什么是rvalue对象以及什么不是在编译时。因此,它可以决定将后者称为右值对象,将前者称为左值对象。我可能遗漏了一些基本的东西,但解释会很棒。
答案 0 :(得分:0)
必须通过const引用传递参数以解决歧义。
C& operator=(const C& rhs)
{
swap(*this, C(tmp));
return *this;
}
由于您的班级C
有一个移动构造函数C::C(C&&)
(我认为是这样,您没有提供Minimal, Complete, and Verifiable example),因此它会导致operator=(C rhs)
和{之间的含糊不清{1}}。