【问题标题】:c++ copy-assignment move-assignment ambiguity时间:2019-01-10 标签:c++copy-assignment move-assignment ambiguity
【发布时间】: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 表示CC&& 对于重载是模棱两可的

标签: c++11 move-semantics rvalue


【解决方案1】:

参数必须通过 const 引用来解决歧义。

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

由于你的类C 有一个移动构造函数C::C(C&&)(我认为是这样,你没有提供Minimal, Complete, and Verifiable example)然后它会导致operator=(C rhs)operator=(C&& rhs) 之间的歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多