在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行声明)无法引用 - 它是一个已删除的函数”
我错过了什么?
答案 0 :(得分:33)
当你编译代码时,这是用微软自己的编译器完成的,这个编译器一直回到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尚未实现。