【发布时间】: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