我感谢C ++ 11标准规定:
如果类定义未明确声明一个副本构造函数,则将隐式声明一个副本构造函数。如果类定义声明了move构造函数或move赋值运算符,则隐式声明的copy构造函数定义为delete;否则,将其定义为默认值。
(实际上是从此处复制的)
如下代码:
#include <iostream>
struct C
{
int x = 1;
C()
{
}
C(C&&)
{
}
};
int main()
{
const C c;
C c2(c);
std::cout << c.x << " " << c2.x << std::endl;
return 0;
}
不能在上编译gcc 4.9.0
,但可以在Visual Studio 2013(Compiler Version 18.00.21005.1 for x86
)上正常编译。这是Visual Studio又一次违反标准吗,还是这次我做错了什么?如果这违反了标准,是否存在跟踪错误或记录此行为的任何来源?
您没有做错任何事情,并且您对该标准的解释是正确的。Visual C ++ 2013确实不能正确实现这些规则。
相关的错误报告在这里:
即使定义了自定义移动构造函数,也会生成默认的复制构造函数[c ++ 11]
标记为Won't Fix
,开发团队的评论是:
实际上,Visual Studio 2013并未完全实现用于管理特殊成员函数和移动操作的C ++ 11规则。在Visual Studio的下一个主要版本中,我们将包含针对此错误的修复程序。
好消息是,Visual C ++ 2015 RC中似乎一切正常。我刚刚验证了您的代码会触发编译器和IntelliSense错误。编译器诊断为:
error C2280: 'C::C(const C &)': attempting to reference a deleted function
(根据我过去几个月的测试,MSVC14正在成为一个非常不错的C ++编译器-已解决了许多标准合规性问题。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句