2011-03-17 150 views
3

Visual Studio 2010具有許多擴展(默認激活)/關於C++標準的差異。Visual Studio 2010:擴展/差異

這種差異可能會令人驚訝,並引發與其他行爲不同的行爲。 VS尤其因爲模板代碼驗證過於鬆懈而着名,並且被VS接受和編譯的模板代碼通常會被更多的兼容編譯器(CLang,Comeau,icc,gcc,...等等)徹底拒絕。

此問題的目標是爲這些差異提供參考(因此FAQ標籤)。

請提供每差異(檢查重複的)一個答案,每個:

  • 解釋這種差異
  • 告訴我們,如果有可能禁用此(如果有的話,怎麼樣)
  • 解釋結果(除了純粹的拒絕)

注意:C++ 0x是下一個標準,所以避免列出C++ 0x擴展,因爲它們很快就會標準化爲

從@Matteo意大利:Visual Studio Compliance Page所有的

+0

你在找蟲子呢?因爲有一些錯誤不是擴展名。 – 2011-03-17 17:26:15

+1

如果Visual Studio是什麼版本? – AnT 2011-03-17 17:33:40

+1

您需要指定一個版本。許多人發佈的問題在VS2010中不存在。 – Puppy 2011-03-17 17:49:39

回答

6

首先,我會聯繫有關這個主題的微軟服食。

可以找到所有的Microsoft語言擴展here;還有一個頁面,其中列出了VC++不符合標準的areas of the language

+0

謝謝,我直接鏈接了問題中的合規問題:) – 2011-03-17 17:31:40

4

默認情況下,編譯器允許將臨時綁定到非const引用。

補救措施:使用警告級別4

+0

有沒有辦法禁用這個?我真的很想知道在重載解決方案中與r值相關聯。 – 2011-03-17 17:33:34

+1

GT是「禁用擴展」開關,但打破了Windows標頭。 :-(它可以很好地與右值參考參數一起工作,因爲這對於臨時性來說會更好。 – 2011-03-17 17:37:11

+0

不,它沒有,我只是試過了,2008也沒有。 – Puppy 2011-03-17 17:49:17

1

的Visual C++不完全支持值初始化(或者更確切地說,有蟲子在目前所有版本的Visual C++,從Visual C++ 2005通過Visual C++ 2010 SP1)。

有關於此的severalreportedbugs(另請參閱this answer to another question)。

後果:某些應該重新初始化對象的代碼形式會使對象或對象的某些部分未初始化。

解決方法:不要依賴值初始化。

0

差異: Visual Studio在首次評估期間不會綁定模板中的非依賴名稱。

標準需要兩個階段的評價:

  • 第一:檢查基本模板良構,結合非依賴性的名稱(其包含過載分辨率)
  • 第二:實例化適當

禁用?它不受任何選項或開關,它根本沒有實現。

後果:

的Visual Studio只做the second phase,從而影響:在模板代碼

  • 錯誤只在實例被檢測到,所以你最好實例,你早期寫的所有的模板(把它看作編譯單元測試)。
  • 丟失templatetypename關鍵字未被VS檢測到
  • 重載決定後可能會拾取「模板」後聲明的重載。沒有太多的問題,因爲恢復包含訂單會產生相同的結果。
+0

這不是真的 - VS會拋出'typename'關鍵字。不過,不是'模板'。 – Puppy 2011-03-17 17:33:33

+0

@DeadMG:從內存中可以在類中編寫'typedef T :: iterator迭代器;'而不會被編譯器困擾。 – 2011-03-17 18:44:02

+0

這不完全正確。但是,有些情況下只會生成警告,而標準合規性則需要錯誤。 – 2011-03-26 10:41:20

0
+0

對不起,不準確的版本。我不知道有多少人仍在使用較舊版本的VS,但我希望大多數用戶使用SO來使用更新版本(VS 9/VS 10)。 – 2011-03-17 18:45:07