For*_*ing 14 copy-constructor assignment-operator c++11
在VS 2010 SP1中,以下内容:
class Foo
{
public:
Foo() { }
Foo(Foo const&) = delete; // Line 365
Foo& operator=(Foo const&) = delete; // Line 366
};
Run Code Online (Sandbox Code Playgroud)
不编译.它抱怨说:
CPPConsole.cpp(365):错误C2059:语法错误:';'
CPPConsole.cpp(365):错误C2238:';'之前的意外标记
CPPConsole.cpp(366):错误C2059:语法错误:';'
CPPConsole.cpp(366):错误C2238:';'之前的意外令牌
这不支持吗?奇怪的是,Intellisense似乎认识到这种结构.它说"IntelliSense:function"Foo :: operator =(const Foo&)"(在第366行声明)无法引用 - 它是一个已删除的函数"
我错过了什么?
Jer*_*fin 33
VS 2010具有双重个性.具体来说,它实际上有两个完全独立的编译器前端.
当你编译代码时,这是用微软自己的编译器完成的,这个编译器一直回到MS-DOS的MS C 3.0,大约30年前发布(如果你想知道为什么它是3.0,MS出售了一个标记版本的莱迪思C之前).
直到VS 2008,与编译器相比,IDE中的解析相当原始,因此它没有正确地解析许多更复杂的C++.他们认为这是不可接受的,而不是尝试升级IDE的现有解析器以匹配编译器,他们授权EDG编译器前端.
这或多或少地提供了相反的情况:IDE的Intellisense解析器现在比编译器上的解析器更接近于符合,并且识别出编译器没有的相当数量的C++ 0x构造.
尽管如此,故事还有一点:EDG编译器前端支持一个开关,使其更像VC++,包括模拟相当数量的VC++错误.虽然我没有数据来确认它,但我的假设是Microsoft使用该功能.由于这是基于EDG采用VC++编译器并模拟其错误,因此可能是一个公平的猜测(至少通常)EDG的VC++仿真将运行VC++本身的版本.这给出了一些有点自相矛盾的情况,其中EDG(正常使用)通常比VC++领先一点,但MS在IDE中使用的版本可能在大多数情况下至少略微落后.
| 归档时间: |
|
| 查看次数: |
10647 次 |
| 最近记录: |