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。
答案 0 :(得分:2)
这似乎确实是一个编译器错误。
由于您已定义了用户提供的移动赋值运算符,因此应将复制赋值运算符隐式定义为已删除(如12.8.18中所述)。这是其他编译器(例如gcc)所表现出的行为。