gd1*_*gd1 8 c++ visual-studio c++11 visual-studio-2013
我很欣赏C++ 11标准所规定的:
如果类定义没有显式声明复制构造函数,则会隐式声明一个.如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除 ; 否则,它被定义为默认.
(实际上从这里复制)
以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
不编译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
Run Code Online (Sandbox Code Playgroud)
(根据我在过去几个月中测试过的,MSVC14正在成为一个相当不错的C++编译器 - 许多标准的合规性问题已得到修复.)
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |