2011-08-17 171 views
14

在VS 2010 SP1,執行以下操作:「刪除」 拷貝構造函數/分配在C++ 11

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:在';'之前的意外標記(s)
CPPConsole.cpp(366):error C2059:syntax error:';'
CPPConsole.cpp(366):錯誤C2238:在';'之前的意外標記(s)

這還不支持?奇怪的是,Intellisense似乎認識到這個構造。它說「智能感知:函數」Foo :: operator =(const Foo &)「(在行366處聲明)不能被引用 - 它是一個刪除函數」

我在想什麼?

回答

33

VS 2010有一些雙重性格。具體來說,它實際上有兩個完全獨立的編譯器前端。

當你編譯代碼時,這是用微軟自己的編譯器完成的,該編譯器一直回到大約30年前發佈的MS-DOS 3.0的MS C 3.0(如果你想知道爲什麼它是3.0,MS在此之前銷售了一個重新標記的版本的萊迪思C)。

直到2008年,IDE中的解析與編譯器相比是相當原始的,所以它沒有正確解析許多更復雜的C++。他們認爲這是不可接受的,而不是嘗試升級IDE的現有解析器以匹配編譯器,他們獲得了EDG編譯器前端的許可。

這或多或少地出現了相反的情況:用於Intellisense的IDE解析器現在比編譯器上的解析器更接近一致,並且識別編譯器沒有的相當數量的C++ 0x構造。

這個故事還不止如此:EDG編譯器前端支持一個開關,使其更像VC++,包括模擬大量的VC++錯誤。儘管我沒有數據來確認它,但我的假設是微軟使用該功能。由於這是基於EDG採用VC++編譯器,並模擬它的錯誤,所以可以肯定地猜測(至少通常情況下)EDG的VC++仿真將運行在VC++自身背後的版本上。這給出了EDG(在正常使用中)通常比VC++稍遜一籌的有些自相矛盾的情況,但MS在IDE中使用的版本可能在大多數情況下至少略微落後。

+2

謝謝!也用歷史的角度回答問題+1。 – ForeverLearning

+0

我不確定intellisense解析器比提供的編譯器更接近標準。當intellisense在編譯器的ADL發現它沒有問題時顯示「沒有操作符匹配的操作數」時,我經常會觀察到相反的情況。它看起來不像一致性是intellisense不同的解析器的原因,而是解析速度。 –

+0

@Gene - 編譯器因未正確執行ADL和模板而出名。EDG前端更可靠。 –

-1

它尚未在VS2010中實現。

+0

那麼intellisense如何知道它已被刪除,因此無法被引用? – ForeverLearning

+3

如果我不爲此感到困惑,爲什麼我會在我的問題中指出一個「奇怪」的東西? – ForeverLearning

+1

@DeadMG,不要太瘋狂。 _「我錯過了什麼?」_與問題一樣是_「這還不支持嗎?」_。 –