xml*_*lmx 7 c++ compiler-construction copy-constructor deleted-functions c++11
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!
}
}
Run Code Online (Sandbox Code Playgroud)
根据C++标准12.8.7:
如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除;
和12.8.18
如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制赋值运算符被定义为已删除;
该语句a = b;应该触发编译器错误.但是,我的编译器(VC++ 2013 RC)接受它并调用隐式定义的复制赋值.
这是编译器的错误吗?
更新:
我已将此问题作为错误提交给microsoft.
这看起来确实是一个编译器错误。
由于您已经定义了用户提供的移动赋值运算符,因此复制赋值运算符应隐式定义为已删除(如 12.8.18 中指定)。这是其他编译器(例如 gcc)所表现出的行为。