为什么在声明移动赋值时不会删除复制分配?

时间:2013-10-09 08:48:50

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

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

1 个答案:

答案 0 :(得分:2)

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

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