1. 程式人生 > >[轉載]Visual Studio, GCC, Clang, Intel 對 C++11 特性的支援一覽表

[轉載]Visual Studio, GCC, Clang, Intel 對 C++11 特性的支援一覽表

參與翻譯(3人):throwable, jimmyjmh, Khiyuan

距離我上次對C++11支援的不同編譯器的比較已經有大半年了。這次我來根據這些預覽版的編譯器的文件來看下它們是如何堆砌起來的。

GCC的下個版本是4.8,以及Clang即將到來的版本是3.3 。如果你使用Visual Studio 2012,你可以安裝2012年11月更新支援C++11額外特徵的體驗版CTP。

我也對V.13.0的Intel C++編譯器感到好奇,雖然它還不是預覽版並且我也找不到有關它的新特性的資訊。我沒找到任何有關這個即將發行版本的編譯器的資訊。

FeatureVS2012
Nov CTP
g++ 4.8Clang 3.3Intel 13.0
autoYesYesYesYes
decltypeYesYesYesYes
Rvalue references and move semanticsYesYesYesYes
Lambda expressionsYesYesYesYes
nullptrYesYesYesYes
static_assertYesYesYesYes
Range based for loopYesYesYesYes
Trailing return type in functionsYesYesYesYes
extern templatesYesYesYesYes
>> for nested templatesYesYesYesYes
Local and unnamed types as template argumentsYesYesYesYes
Variadic macrosYesYesYesYes
Variadic templatesYesYesYesYes
Default template arguments in function templatesYesYesYesYes
final method keywordYesYesYesNo
override method keywordYesYesYesNo
Strongly typed enumsYesYesYesPartial
Forward declared enumsYesYesYesPartial
Initializer listsYesYesYesPartial
explicit type conversion operatorsYesYesYesNo
Raw string literalsYesYesYesNo
Forwarding constructorsYesYesYesNo
Template aliasesNoYesYesYes
Defaulted methodsNoYesYesYes
Deleted methodsNoYesYesYes
New built-in typesPartialYesYesPartial
Alignment supportPartialYesYesNo
Inline namespacesNoYesYesNo
sizeof on non-static data members without an instanceNoYesYesNo
Changed restrictions on union membersNoYesYesNo
User defined literalsNoYesYesNo
Encoding support in literalsNoYesYesNo
Arbitrary expressions in template deduction contextsNoYesYesDon’t know
Non-static data member initializersNoYesYesDon’t know
noexceptNoYesYesPartial
constexprNoYesYesPartial
C99 compatibilityPartialYesPartialYes
Generalized attributesNoYesPartialYes
Thread local storagePartialYesNoPartial
Inheriting constructorsNoYesNoNo
Rvalue references for *thisNoNoYesNo
Minimal support for garbage collectionYesNoNoDon’t know

看起來GCC正取代Clang成為最支援C++11的編譯器。Visual Studio已經增加了好幾個重要C++11特性,像變參模板,初始化器和原生字。

我真的不能在一個更為細緻的層面去評論這些編譯器實現到底完成得怎樣,還有沒有bug。(除了VS2012——我在我的書(《C++11 Rocks》)裡詳細列出過VS2012最初版本的大量bug)。

看下庫的支援情況也是比較有用的。由於各編譯器對標準庫的支援都有較多小改動,我並不打算對此給出詳細的細節。我也打算在這次的比較中省略Intel的庫。

我可以說,這些庫的主要附件大多由第三方實現提供(隨後在下面的表格中展現),儘管這是有各種各樣的警告。

微軟的庫實現中沒有那些需求尚未被實現的語言功能的東西,例如 constexpr(如VS2012的最初發行版)。庫檔案還沒有更新,以支援2012年11月在 CTP 提出的編譯器功能,如初始化列表和可變引數模板。

GCC 的 libstdc++ 也有些滯後,例如它並不支援正則表示式以及地稱併發功能。同樣,在很多情況下,它也沒有實現 constexpr 方法。

Clang的libc++是100%相容MacOS的,但是它有部分的特性還不相容Windows和Linux。

FeatureMSVClibstdc++libc++
Concurrency: async/future/promise/packaged_taskYesYesYes
Concurrency: thread and relatedYesYesYes
Concurrency: condition variablesYesYesYes
Concurrency: mutexesYesYesYes
Concurrency: atomic types and operationsYesYesYes
Concurrency: relaxed memory ordering and fencesYesNoYes
Smart pointersYesYesYes
TuplesYesYesYes
std::bindYesYesYes
std::functionYesYesYes
Regular expressionsYesNoYes
Type traitsYesPartialYes
std::forward_listYesYesYes
std::arrayYesYesYes
Hash tablesYesYesYes
Random number generationYesYesYes
Compile time rational numbers (ratio)YesYesYes
Time utilities (chrono)YesYesYes
Initializer listsYesYesYes
Diagnostics (system_error)YesYesYes
STL refinements and new algorithmsYesYesYes
General purpose (move, forward, declval etc.)YesYesYes

比較高興的是能看到語言和庫的支援在穩步改善。Clang和GCC距離完全支援C++11已經很近了。Visual Studio同樣在改善對C++11的支援,令我感到欣慰的是C++編譯器的更新都是在主分支上。這份Intel的編譯器特徵支援列表也越來越多。

誰知道明年這4個編譯器會不會全部支援C++11的特徵呢!

本文中的所有譯文僅用於學習和交流目的,轉載請務必註明文章譯者、出處、和本文連結
我們的翻譯工作遵照 CC 協議,如果我們的工作有侵犯到您的權益,請及時聯絡我們