7
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

4

1 回答 1

2

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

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

于 2013-10-09T09:11:14.680 回答