c ++ copy-assignment移动赋值歧义

时间:2018-04-13 03:51:34

标签: c++11 move-semantics rvalue

在C ++ 11中,如果我们做出以下定义,我们会从编译器(g ++)中得到歧义错误:

C& operator=(C rhs)
{
    swap(*this, rhs);
    return *this;
}

C& operator=(C&& rhs)
{
    swap(*this, rhs);
    return *this;
}

我不清楚为什么会有歧义。根据我的理解,编译器可以区分什么是rvalue对象以及什么不是在编译时。因此,它可以决定将后者称为右值对象,将前者称为左值对象。我可能遗漏了一些基本的东西,但解释会很棒。

1 个答案:

答案 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}}。