主流編譯器對C++11的支援現狀比較
GCC 4.8剛剛釋出,Clang 3.3也釋出在即,如果你使用Visual Studio 2012,也可以通過安裝一個實驗性的CTP更新(VS2012 Nov CTP)來獲取額外的C++11支援;除此之外,這裡還比較了Intel C++編譯器v.13.0,不過這仍然是一個預覽版。
特性 |
VS2012 Nov CTP |
g++ 4.8 | Clang 3.3 | Intel 13.0 |
---|---|---|---|---|
auto | Yes | Yes | Yes | Yes |
decltype | Yes | Yes | Yes | Yes |
Rvalue references and move semantics | Yes | Yes | Yes | Yes |
Lambda expressions | Yes | Yes | Yes | Yes |
nullptr | Yes | Yes | Yes | Yes |
static_assert | Yes | Yes | Yes | Yes |
Range based for loop | Yes | Yes | Yes | Yes |
Trailing return type in functions | Yes | Yes | Yes | Yes |
extern templates | Yes | Yes | Yes | Yes |
>> for nested templates | Yes | Yes | Yes | Yes |
Local and unnamed types as template arguments | Yes | Yes | Yes | Yes |
Variadic macros | Yes | Yes | Yes | Yes |
Variadic templates | Yes | Yes | Yes | Yes |
Default template arguments in function templates | Yes | Yes | Yes | Yes |
final method keyword | Yes | Yes | Yes | No |
override method keyword | Yes | Yes | Yes | No |
Strongly typed enums | Yes | Yes | Yes | Partial |
Forward declared enums | Yes | Yes | Yes | Partial |
Initializer lists | Yes | Yes | Yes | Partial |
explicit type conversion operators | Yes | Yes | Yes | No |
Raw string literals | Yes | Yes | Yes | No |
Forwarding constructors | Yes | Yes | Yes | No |
Template aliases | No | Yes | Yes | Yes |
Defaulted methods | No | Yes | Yes | Yes |
Deleted methods | No | Yes | Yes | Yes |
New built-in types | Partial | Yes | Yes | Partial |
Alignment support | Partial | Yes | Yes | No |
Inline namespaces | No | Yes | Yes | No |
sizeof on non-static data members without an instance | No | Yes | Yes | No |
Changed restrictions on union members | No | Yes | Yes | No |
User defined literals | No | Yes | Yes | No |
Encoding support in literals | No | Yes | Yes | No |
Arbitrary expressions in template deduction contexts | No | Yes | Yes | Don’t know |
Non-static data member initializers | No | Yes | Yes | Don’t know |
noexcept | No | Yes | Yes | Partial |
constexpr | No | Yes | Yes | Partial |
C99 compatibility | Partial | Yes | Partial | Yes |
Generalized attributes | No | Yes | Partial | Yes |
Thread local storage | Partial | Yes | No | Partial |
Inheriting constructors | No | Yes | No | No |
Rvalue references for *this | No | No | Yes | No |
Minimal support for garbage collection | Yes | No | No | Don’t know |
從表格資料我們可以看到,GCC正在取代Clang成為C++11支援最佳的編譯器,而Visual Studio在對C++11特性的支援上也有明顯的改進,特別是新增對variadic templates、 initializer lists以及raw literals的支援。當然這些支援中那些屬於完全支援,哪些是無bug的支援不得而知,需要開發者自己去體驗。
除了C++11特性之外,對其類庫的支援同樣需要的到重視,但下表中不會標註各編譯器支援與標準庫之間的細小差別。
- 微軟的庫並沒有實現那些需要尚未被實現的語言功能支援的東西,例如 constexpr(在Visual Studio 2012最初的發行版中)。庫檔案並沒有為支援2012年11月CTP中使用的特性——如 initializer list(初始化列表)和variadic template(可變引數模板)——而更新。
- GCC libstdc++有點滯後,因為它不支援正則表示式以及低階並行特性,此外,在很多情況下也沒有實現constexpr方法。
- Clang對libc++的支援在Mac OS上非常完美,但部分功能尚未在Windows和Linux下實現。
特性 | MSVC | libstdc++ | libc++ |
---|---|---|---|
Concurrency: async/future/promise/packaged_task | Yes | Yes | Yes |
Concurrency: thread and related | Yes | Yes | Yes |
Concurrency: condition variables | Yes | Yes | Yes |
Concurrency: mutexes | Yes | Yes | Yes |
Concurrency: atomic types and operations | Yes | Yes | Yes |
Concurrency: relaxed memory ordering and fences | Yes | No | Yes |
Smart pointers | Yes | Yes | Yes |
Tuples | Yes | Yes | Yes |
std::bind | Yes | Yes | Yes |
std::function | Yes | Yes | Yes |
Regular expressions | Yes | No | Yes |
Type traits | Yes | Partial | Yes |
std::forward_list | Yes | Yes | Yes |
std::array | Yes | Yes | Yes |
Hash tables | Yes | Yes | Yes |
Random number generation | Yes | Yes | Yes |
Compile time rational numbers (ratio) | Yes | Yes | Yes |
Time utilities (chrono) | Yes | Yes | Yes |
Initializer lists | Yes | Yes | Yes |
Diagnostics (system_error) | Yes | Yes | Yes |
STL refinements and new algorithms | Yes | Yes | Yes |
General purpose (move, forward, declval etc.) | Yes | Yes | Yes |
可以看到,C++及其類庫的支援已經大有提升,Clang和GCC幾乎已經為C++11提供了完整的支援;Visual Studio也增強了對C++11的支援;同時Intel的編譯器對C++11的支援大幅提升。
相信到明年,各主流編譯器應該都能夠完全支援C++11標準。
相關推薦
主流編譯器對C++11的支援現狀比較
GCC 4.8剛剛釋出,Clang 3.3也釋出在即,如果你使用Visual Studio 2012,也可以通過安裝一個實驗性的CTP更新(VS2012 Nov CTP)來獲取額外的C++11支援;除此之外,這裡還比較了Intel C++編譯器v.13.0,不過這仍然是一個預覽版。 特性 VS
VS2010對c++11的支援情況驗證
目前僅僅測試工作中 使用的比較多的: 智慧指標 shared_ptr #include <memory> std::shared_ptr<A> a(new A); ----支援! 同時也支援 make_shared weak_ptr ----支援,畢竟這是個給shared
VS2010對C++11的支援程度
#include <cassert> #include <cctype> #include <cerrno> // #include <cfenv> // 不支援 #include <cfloat> // #include <cint
[轉載]Visual Studio, GCC, Clang, Intel 對 C++11 特性的支援一覽表
參與翻譯(3人):throwable, jimmyjmh, Khiyuan距離我上次對C++11支援的不同編譯器的比較已經有大半年了。這次我來根據這些預覽版的編譯器的文件來看下它們是如何堆砌起來的。GCC的下個版本是4.8,以及Clang即將到來的版本是3.3 。如果你使用Visual Studio 2012
VS2010、VS2012、VS2013、VS2015對C++11的支援進度
支援 C++11/14/17 功能(現代 C++) 若要了解有關 Visual Studio 2017 RC 的最新文件,請參閱 Visual Studio 2017 RC 文件。 本文描述了 Visual C++ 中的 C++11/14/17 功
gcc對C++11的支援
1 2 3 4 5 6 7 8 9 10 11 12 /* file : main.cpp */ #include <stdio.h> int main() { int a[5] = { 1, 2, 2, 5, 1 }; for( i
VS2010對c++11的支持情況驗證
正則 param 所有 簡化 turn 推導 variables 閉包 ret 目前僅僅測試工作中 使用的比較多的: 智能指針 shared_ptr #include <memory> std::shared_ptr<A> a(new A); --
對C++11條件變數的理解(邏輯)
之前對條件變數一直抱有疑惑,通過互斥鎖已經能夠保證同一時刻只有一個執行緒訪問共享區資源了,那還要用條件變數幹什麼呢?說到這裡,解惑來源於這篇文章c++11執行緒之條件變數condition_variable,互斥鎖只能保證執行緒不同時訪問共享區資源,但是訪問的順
對c++11下新增字元編碼格式轉換函式的簡單封裝
c++11標準新增了一些字串編碼格式轉換的函式和類,方便開發者寫跨平臺程式碼。我對它們做了簡單的封裝並在VS2013測試通過。 #pragma once #include <cstdlib> #include <cassert> #include &
關於在ubuntu下eclipse中c++11支援和編譯執行c++11報錯的解決方法
最近準備升級專案中的c++執行緒部分程式碼用c++11簡單重構一下,結果測試demo直接就報錯~ 百度和谷歌了一部分還是沒有解決這個問題~ 最後經過研究eclipse的自動編譯~終於搞定了~ 首先按照網上說的~ http://hkllzh.iteye.com/blog/1
對C++11中的`移動語義`與`右值引用`的介紹與討論
本文主要介紹了C++11中的移動語義與右值引用, 並且對其中的一些坑做了深入的討論. 在正式介紹這部分內容之前, 我們先介紹一下rule of three/five原則, 與copy-and-swap idiom最佳實踐. 本文參考了stackoverflow上的一些回答. 不能算是完全原創 rule
C++11中對容器的各種循環遍歷的效率比較
ets normal pre unsigned int qdebug tex contain string 1 #include "CycleTimeTst.h" 2 #include <string> 3 #include <vector&
CentOS上升級gcc編譯器使支援C++11
首先向博主致敬,好的東西拿來共享了,用一下不錯。 https://blog.csdn.net/clirus/article/details/62424517 0. 目標 最近在學習c++11,我本機裝的CentOS編譯器較老,不支援C++11的新特性,所以我需要把g
各C/C++編譯器對wchar_t字元和字串的正確支援程度
傳統的C風格的字串是以字元 '/0 '為結尾的一系列位元組的集合,其一個單元為char型別,可以儲存世界上的幾百種不同的字符集,包括ASCII、ISO-8859、GBK、BIG-5、SHIFT-JIS、UTF-8等等。通常這些字符集都是相容ASCII字符集的
膜拜性轉帖: C++11有關的(現在用的編譯器都是不太支援C++11的)
過去的一年我在微軟亞洲研究院做輸入法,我們的產品叫“英庫拼音輸入法” (下載Beta版),如果你用過“英庫詞典”(現已更名為必應詞典),應該知道“英庫”這個名字(實際上我們的核心開發團隊也有很大一部分來源於英庫團隊的老成員)。整個專案是微軟亞洲研究院的自然語言處理組、網際網路搜尋與挖掘組和我們創新工程中心,
RedHat gcc編譯器版本升級到4.8.2支援C++11標準
原來環境資訊 Red Hat Enterprise Linux Server release 6.4 (Santiago) gcc4.4.7 升級到gcc4.8.2 gcc4.8以上版本才支援C++11標準,網上很多都是裝的4.8系列的版本,
Visual Studio2013的C語言編譯器對C99標準的支援情況
Visual Studio2013終於開始比較良好地支援C99特性了。在此之前,如果用C語言寫程式碼的話,變數名都需要放到函式體的前面部分,程式碼寫起來十分別扭。 而Visual Studio2013中的C編譯器已經支援了不少C99標準,讓我來為大家盤點一下。 現在仍
c++的單例模式及c++11對單例模式的優化
on() end per let namespace lease 是否 存在 建立 單例模式 單例模式,可以說設計模式中最常應用的一種模式了,據說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全
C++11新特性,bind,基於對象
實體 oca jci con data () ebr mrp ddd body, table{font-family: 微軟雅黑; font-size: 10pt} table{border-co
linux之讓終端支援C++11/14編譯cpp檔案
1 問題 我們的專案很多智慧指標,但是我linux的終端肯定不支援C++11/14, 我們平時都是用的下面的命令編譯c++檔案 g++ -g file.cpp -o file r 如果是用c++11編譯需要改成如下 g++ -g -Wall -std=c+