【问题标题】:Why is the copy assignment not deleted when the move assignment is declared?为什么声明移动赋值时复制赋值没有被删除?
【发布时间】:2013-10-16 12:36:05
【问题描述】:
struct A
{
    A(int x)
        : n(x)
    {}

    A(A&&)
    {}

    A& operator =(A&&)
    {
        return *this;
    }

    int n;
};

int main()
{
    A a(1), b(2);

    a = b;

    if (2 == a.n)
    {
        // It SHOULD go here!
    }
}

按照 C++ 标准 12.8.7:

如果类定义声明了移动构造函数或移动赋值 运算符,隐式声明的复制构造函数定义为 已删除;

和 12.8.18

如果类定义声明了移动构造函数或移动赋值 运算符,隐式声明的复制赋值运算符被定义 已删除;

语句a = b; 应该会触发编译器错误。但是,我的编译器 (VC++ 2013 RC) 接受它并改为调用隐式定义的复制赋值。

这是编译器的错误吗?

更新:

我已将此问题作为错误提交给microsoft

【问题讨论】:

  • "这是编译器的错误吗?"这不会让我感到惊讶。 MSVC 对 move ctors 和 move assignment op 的处理一直缺乏。
  • a = b 不会调用复制构造函数,对吗?
  • 这里不是a = b 复制分配吗?您的报价说复制构造函数被删除,而不是复制赋值运算符。
  • @Useless,因为copy-assignment应该已经被删除了,所以会报错。
  • @juanchopanza,我的错。我添加了另一个报价。

标签: c++ c++11 compiler-construction copy-constructor deleted-functions


【解决方案1】:

这似乎确实是一个编译器错误。

由于您已定义用户提供的移动赋值运算符,因此应将复制赋值运算符隐式定义为已删除(如 12.8.18 中所指定)。这是其他编译器(例如 gcc)表现出的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2019-04-12
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多