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

时间:2011-08-17 17:49:27

标签: c++11 copy-constructor assignment-operator

在VS 2010 SP1中,以下内容:

class Foo
{
public:
    Foo() { }
    Foo(Foo const&) = delete; // Line 365
    Foo& operator=(Foo const&) = delete; // Line 366
};

无法编译。它抱怨道:

  

CPPConsole.cpp(365):错误C2059:语法错误:';'
  CPPConsole.cpp(365):错误C2238:';'之前的意外标记   CPPConsole.cpp(366):错误C2059:语法错误:';'
  CPPConsole.cpp(366):错误C2238:';'之前的意外令牌

这还不支持吗?奇怪的是,Intellisense似乎认识到这种结构。它说“IntelliSense:function”Foo :: operator =(const Foo&)“(在第366行声明)无法引用 - 它是一个已删除的函数”

我错过了什么?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

VS2010尚未实现。