在C++ 11中"删除"复制ctor/assignment

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中使用的版本可能在大多数情况下至少略微落后.

  • 谢谢!+1用于回答具有历史视角的问题. (2认同)