1. 程式人生 > >主流編譯器對C++11的支援現狀比較

主流編譯器對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

VS2010c++11支援情況驗證

目前僅僅測試工作中 使用的比較多的: 智慧指標 shared_ptr #include <memory> std::shared_ptr<A> a(new A); ----支援! 同時也支援 make_shared weak_ptr ----支援,畢竟這是個給shared

VS2010C++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、VS2015C++11支援進度

支援 C++11/14/17 功能(現代 C++) 若要了解有關 Visual Studio 2017 RC 的最新文件,請參閱 Visual Studio 2017 RC 文件。 本文描述了 Visual C++ 中的 C++11/14/17 功

gccC++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

VS2010c++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+