c++11介紹

C++11標準是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的簡稱[1]   。
C++11標準由 國際標準化組織(ISO)和 國際電工委員會(IEC)旗下的C++標準委員會(ISO/IEC JTC1/SC22/WG21)於2011年8月12日公佈[2]   ,並於2011年9月出版。2012年2月28日的國際標準草案(N3376)是最接近於C++11標準的草案(僅編輯上的修正)。這次標準爲C++98發佈後13年來第一次重大修正。
中文名
C++11
外文名
C++11
標準版本
C++標準第三版
發佈時間
2011年8月12日
出版時間
2011年9月
標準文件號
ISO/IEC 14882:2011

簡介

編輯
C++11標準爲C++編程語言的第三個官方標準,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 。[1]   在正式標準發佈前,原名C++0x。它將取代C++標準第二版ISO/IEC 14882:2003 - Programming languages -- C++ 成爲C++語言新標準。
C++11包含了核心語言的新機能,而且拓展C++標準程序庫,而且加入了大部分的C++ Technical Report 1程序庫(數學上的特殊函數除外)。C++ 標準委員會計劃在2010年8月以前完成對最終委員會草案的投票,以及於2011年3月3召開的標準會議完成國際標準的最終草案。最終於2011年8月12日公佈,並於2011年9月出版。2012年2月28日的國際標準草案(N3376)是最接近於現行標準的草案(編輯上的修正)。這次標準爲13年第一次重大修正。
ISO將在2014年和2017年發佈C++的後續版本[3]   。
C++語言的標準化進程 C++語言的標準化進程

版本變動

編輯
1.對C++核心語言的擴充
2.核心語言運行期的強化(右值引用和 move 語義;泛化的常數表達式;對POD定義的修正)
3.核心語言建構期表現的增強(外部模板)
4.核心語言使用性的增強(初始化列表;統一的初始化;類型推導[auto關鍵字];以範圍爲基礎的 for 循環;Lambda函數與表示法;另外一種的函數語法;對象構建的改良;顯式虛函數重載;空指針;強類型枚舉;角括號;顯式類型轉換;模板的別名;無限制的unions)
5.核心語言能力的提高(變長參數模板;新的字符串字面值;用戶自定義的字面值;多任務存儲器模型;thread-local的存儲期限;使用或禁用對象的默認函數;long long int 類型;靜態assertion;容許sizeof運算符做用在類型的數據成員上,無需明確的對象;)
6.C++標準程序庫的變動(標準庫組件的升級;線程支持;多元組類型;散列表;正則表達式;通用智能指針;可擴展的隨機數功能;包裝引用;多態函數對象包裝器;用於元編程的類型屬性;用於計算函數對象返回類型的統一方法)

現狀

編輯
每一個標準的發佈都須要一段時間的普及。包括技術圖書,編譯器支持。C++11標準發佈後,美國已經更新了大部分著名C++圖書,以支持最新的C++11標準,例如:《C++ Primer (Fifth Edition)》、《C++ Primer Plus (Sixth Edition)》、《The C++ Programming Language (4th Edition)》等等。這幾本書都已經有了中文翻譯版,分別名叫《C++ Primer 中文版(第五版)》、《C++ Primer Plus 中文版(第六版)》、《C++程序設計語言(第四版)》。各大主流編譯器產商也逐步添加了對C++11語法的支持,例如VS20十二、g++、clang等都在很大程度上支持C++11標準。圖爲迄今支持狀況。
編譯器實現狀況 編譯器實現狀況

示例

編輯

類型推導與auto關鍵字

C++ 11 標準廢除了舊的 C++ 98 標準中 auto 的意思(自動變量類型),改爲了自動類型推導的意思。
在標準C/C++,使用變量必須明確的指出其類型(強類型)。然而隨着模板類型的出現以及模版元編程的技巧,指定類型,特別是函數定義明確的指定返回類型,就不容易表示。在這樣的狀況下,將中間結果存儲與變量是一件困難的事情,可能會須要知道特定的元編程程序庫的內部狀況。
C++11提供了兩種方法緩解上述所遇到的困難。首先被有明確初始化的變量可使用auto關鍵字。這會依據該初始化式的具體類型產生變量。示例:
1
auto  otherVariable = 5; //otherVariable被按照int型來編譯
otherVariable 的類是明肯定義的。由於5的類型是int,因此編譯器按照「int otherVariable =5;」來編譯。
1
auto  someStrangeCallableType = boost::bind(&SomeFunction,_2,_1,someObject);
someStrangeCallableType 的類型是模版函數 boost::bind對特定引數返回的類型,做爲編譯器語義分析的一部分,這個類型可以簡單地被編譯器決定,但用戶要經過查看來判斷類型就不是一件容易的事情。
除此以外,C++11還定義了 decltype 可以被用來在編譯器決定一個表達式的類型。舉例:
1
2
int  someInt;
decltype (someInt) otherIntegerVariable = 5;
decltype 和 auto 一塊兒使用會更爲有用,由於 auto 變量的類型只有編譯器知道。然而 decltype 對於那些大量運用運算符重載和特化的類型的代碼的表示也很是有用。
auto 對於減小冗贅的代碼也頗有用。舉例而言,程序員不用寫像下面這樣:
1
for (vector< int >::const_iteratoritr=myvec.begin(); itr!=myvec.end(); ++itr)
可使用auto簡化爲:
1
for ( auto  itr = myvec.begin(); itr != myvec.end(); ++itr)
這項差別隨着程序員開始嵌套容器而更爲顯著,雖然在這種狀況下 typedef 是一個減小代碼的好方法。
decltype 所表示的類型能夠和 auto 推導出來的不一樣。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<vector>
 
int  main()
{
     const  std::vector< int >v(1);
     auto  a = v[0]; //a爲int類型
     decltype (v[0]) b = 0; //b爲const int&類型,即std::vector<int>::operator[](size_type)const的返回類型
     auto  c = 0; //c爲int類型
     auto  d = c; //d爲int類型
     decltype (c) e; //e爲int類型,c實體的類型
     decltype ((c)) f = e; //f爲int&類型,由於(c)是左值
     decltype (0) g; //g爲int類型,由於0是右值
     return  0;
}

外部模板

在標準C++中,只要在編譯單元內遇到被完整定義的模板,編譯器都必須將其實例化(instantiate)。這會大大增長編譯時間,特別是模板在許多編譯單元內使用相同的參數實例化。看起來沒有辦法告訴C++不要引起模板的實例化。
C++11將會引入外部模板這一律念。C++已經有了強制編譯器在特定位置開始實例化的語法:
template class std::vector<MyClass>;
而C++所缺少的是阻止編譯器在某個編譯單元內實例化模板的能力。C++11將簡單地擴充前文語法以下:
extern template class std::vector<MyClass>;
這樣就告訴編譯器 不要在該編譯單元內將該模板實例化。
以範圍爲基礎的for循環
Boost C++ 定義了許多"範圍 (range) "的概念。範圍表現有如受控制的串行 (list),持有容器中的兩點。有序容器是範圍概念的超集 (superset),有序容器中的兩個迭代器 (iterator) 也能定義一個範圍。這些概念以及操做的算法,將被併入 C++11 標準程序庫。不過 C++11 將會以語言層次的支持來提供範圍概念的效用。
for 語句將容許簡單的範圍迭代:第一部分定義被用來作範圍迭代的變量,就像被聲明在通常for循環的變量同樣,其做用域僅只於循環的範圍。而在":"以後的第二區塊,表明將被迭代的範圍。這樣一來,就有了可以容許C-style數組被轉換成範圍概念的概念圖。這能夠是std::vector,或是其餘符合範圍概念的對象。
1
2
3
4
5
int  my_array[5]={1, 2, 3, 4, 5};
for ( int & x : my_array)
{
x *= 2;
}
編譯器支持
  
功能
  
VS2011
  
VS2013 g++ 4.7
  
Clang 3.1
  
auto關鍵字
  
Yes
  
Yes
  
Yes Yes
decltype關鍵字 Yes
  
Yes
  
Yes Yes
右值引用(Rvalue references)與移動語義(move semantics) Yes
  
Yes
  
Yes Yes
Lambda表達式
  
Yes
  
Yes
  
Yes Yes
nullptr關鍵字 Yes
  
Yes
  
Yes Yes
靜態斷言(static_assert)關鍵字[4]  
  
Yes
  
Yes
  
Yes Yes
基於範圍的循環(Range based for loop)語法[5]  Yes
  
Yes
  
Yes Yes
函數返回類型後置(Trailing return type in functions)語法 Yes
  
Yes
  
Yes Yes
final關鍵字 Yes
  
Yes
  
Yes Yes
override關鍵字 Yes
  
Yes
  
Yes Yes
強類型枚舉(Strongly typed enums) Yes
  
Yes
  
Yes Yes
前置枚舉聲明(Forward declared enums)
  
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
新內建類型(New built-in types) Partial(部分) ? Yes Yes
Initializer_lists容器 No ? Yes Yes
顯式類型轉換運算符(explicit type conversion operators) No Yes
  
Yes Yes
內聯命名空間(Inline namespaces) No ? Yes Yes
sizeof用在沒實例時的非靜態成員
(sizeof on non-static data members without an instance)
No ? Yes Yes
改變union成員限制(Changed restrictions on union members) No ? Yes Yes
Raw string literals
  
No Yes Yes Yes
User defined literals
  
No ? Yes Yes
Encoding support in literals
  
No ? Yes Yes
Arbitrary expressions in template deduction contexts
  
No ? Yes Yes
默認方法(Defaulted methods)
  
No Yes(有條件支持)[6]  Yes Yes
刪除方法(Deleted methods)
  
No Yes(有條件支持)[6]  Yes Yes
非靜態成員初始化(Non-static data member initializers)
  
No ? Yes Yes
變參模板(Variadic templates) No ? Yes Yes
函數模板中的默認模板參數
(Default template arguments in function templates)
No ? Yes Yes
模板別名(Template aliases) No ? Yes Yes
前置構造函數(Forwarding constructors) No ? Yes Yes
noexcept關鍵字 No ? Yes Yes
constexpr關鍵字
  
No ? Yes Yes
Alignment 支持
  
Partial(部分) Partial(部分) Yes Yes
*this的右值引用 No ? No Yes
C99兼容性(C99compatibility) Partial(部分) Partial(部分) Partial(部分) Partial(部分)
線程本地存儲(Thread local storage) Partial(部分) Partial(部分) Partial(部分)
  
構造函數繼承(Inheriting constructors) No ? No No
Generalized attributes
  
No ? No No
經過對比能夠發現,Clang在大多數C++11功能實現上處於領先地位,而Visual Studio則稍顯落後。固然,這三個編譯器都有着不錯的子集適用於跨平臺開發。( 注:GCC4.8.1已徹底支持C++11,Clang 3.3 也徹底支持了C++11。最新版本的Linux 發行版(RHEL 7,CentOS 7,Ubuntu 14.06,都自帶了徹底支持C++11的編譯器)
你可使用類型推斷、移動語義、右值引用、nullptr,static_assert,range-based參考對比。同時你還可使用最終和重寫關鍵字來進行友好的控制。此外,你還能夠經過Enums(例舉)強類型和提早聲明,這裏有幾個改進後的模板包括extern keyword。
遺憾的是,Visual Studio並不支持較多請求的可變參數模板。另外一方面,可變參數宏在這三款編譯器中只支持C99標準。繼承構造函數和廣義屬性這些特性並非在任何地方都能得到支持。本地線程存儲是是支持狀況最好的一部分(經過非關鍵字標準)。
下面給出在msdn中列舉的對C++功能的支持

VS C++11功能支持表(總表)

編輯
如下是Microsoft Visual Studio 2010,2012,2013對C++11支持的比較[7]   。
C++11 Core Language Features
Visual Studio 2010
Visual Studio 2012
Visual Studio 2013
Rvalue referencesv0.1,v1.0,v2.0,v2.1,v3.0
v2.0
v2.1*
v2.1*
ref-qualifiers
No
No
No
Non-static data member initializers
No
No
Yes
Variadic templatesv0.9,v1.0
No
No
Yes
Initializer lists
No
No
Yes
static_assert
Yes
Yes
Yes
autov0.9,v1.0
v1.0
v1.0
v1.0
Trailing return types
Yes
Yes
Yes
Lambdasv0.9,v1.0,v1.1
v1.0
v1.1
v1.1
decltypev1.0,v1.1
v1.0
v1.1**
v1.1
Right angle brackets
Yes
Yes
Yes
Default template arguments for function templates
No
No
Yes
Expression SFINAE
No
No
No
Alias templates
No
No
Yes
Extern templates
Yes
Yes
Yes
Yes
Yes
Yes
Strongly typed enums
Partial
Yes
Yes
Forward declared enums
No
Yes
Yes
No
No
No
constexpr
No
No
No
TR1
Partial
Partial
Delegating constructors
No
No
Yes
Inheriting constructors
No
No
No
Explicit conversion operators
No
No
Yes
char16_t/char32_t
No
No
No
Unicode string literals
No
No
No
Raw string literals
No
No
Yes
Universal character names in literals
No
No
No
User-defined literals
No
No
No
Standard-layout and trivial types
No
Yes
Yes
Defaulted and deleted functions
No
No
Yes*
Extended friend declarations
Yes
Yes
Yes
Extended sizeof
No
No
No
Inline namespaces
No
No
No
Unrestricted unions
No
No
No
Local and unnamed types as template arguments
Yes
Yes
Yes
Range-based for-loop
No
Yes
Yes
override and finalv0.8,v0.9,v1.0
Partial
Yes
Yes
Minimal GC support
Yes
Yes
Yes
noexcept
No
No
No

併發能力

編輯
C++11 Core Language Features: Concurrency
Visual Studio 2010
Visual Studio 2012
Visual Studio 2013
Reworded sequence points
N/A
N/A
N/A
Atomics
No
Yes
Yes
Strong compare and exchange
No
Yes
Yes
Bidirectional fences
No
Yes
Yes
Memory model
N/A
N/A
N/A
Data-dependency ordering
No
Yes
Yes
Data-dependency ordering: function annotation
No
No
No
exception_ptr
Yes
Yes
Yes
quick_exit
No
No
No
Atomics in signal handlers
No
No
No
Thread-local storage
Partial
Partial
Partial
Magic statics
No
No
No

VS C++ 11語言功能支持表:C99

編輯

C++11 Core Language Features: C99
Visual Studio 2010
Visual Studio 2012
Visual Studio 2013
__func__
Partial
Partial
Partial
C99 preprocessor
Partial
Partial
Partial
long long
Yes
Yes
Yes
Extended integer types
N/A
N/A
N/A
相關文章
相關標籤/搜索