【C++】C++14

aidear_evo發表於2014-11-10

最新的C++標準為C++14,即ISO/IEC14882:2014,從一開始的C++98到後來的C++03、C++11,以及若干年後的C++17,對廣大C++愛好者來說,每一次的版本提升無疑是一種福音,那就一起擁抱最新的C++技術,共創屬於C++的輝煌時代。

C++14主要是對C++11的一個擴充套件,熟悉C++11的小夥伴們想必不會對C++14的新特性感到陌生,還是先總結一下吧,方便以後使用。

新的語言特性——

1、lambda
原型如下:
[capture] (params) mutable exception attribute - > ret {body}
(1)capture在C++11中捕獲的是已在外層作用域宣告的變數,而在C++14中可以任意宣告lambda的成員,且可以用任意的表示式初始化。
(2)params在C++11中需要被宣告為具體的型別,而在C++14中可以使用型別說明符auto。

2、型別推導
(1)在C++11中,lambda函式可以根據return語句的表示式型別推導返回型別,有後置返回型別說明符;而在C++14中,一般的函式也有這個特性,函式宣告必須將auto作為返回型別,但沒有後置返回型別說明符。
(2)auto和decltype()是C++11引入的兩種推導型別的方式,decltype()需顯式地指定其引數;而C++14增加了decltype(auto)的語法,也就不必顯示地指定其引數了。

3、constexpr
C++11引入了constexpr關鍵字,可以修飾函式、變數,有點像const,但用法不同;C++14對constexpr進行了擴充套件,取消了一些被限制的用法。

4、變數模板
傳統的C++模板可以是函式模板或類别範本,C++11引入了模板別名,需用到using關鍵字而不是typedef,C++14則帶來了變數模板。

5、初始化
C++11引入了大括號初始化成員變數的方法,C++14則對這一初始化方法進行了擴充套件,當花括號初始化列表沒有提供某成員變數的值時會被自動初始化。

6、二進位制字面量
C++14的數字可以用二進位制形式指定,其字首為0b或0B。

7、數字分位符
C++14引入了單引號來作為數字分位符,增強了數字可讀性。

新的標準庫特性——

1、共享的互斥體
std::shared_timed_mutex

2、關聯容器的異構查詢
C++標準庫定義了四個關聯容器類,map、set、multimap、multiset,查詢時只能接收指定型別的引數,C++14允許通過其它型別進行查詢,只需要這個型別和實際的鍵型別之間可以進行比較操作。

3、標準自定義字面量
C++11增加了自定義字面量的特性,使使用者能夠定義新的字面量字尾,但標準庫並沒有對這一特性加以利用,C++14標準庫定義了以下字面量字尾:
“s”,用於建立各種std::basic_string型別。
“h”、“min”、“s”、“ms”、“us”、“ns”,用於建立相應的std::chrono::duration時間間隔。

4、通過型別定址多元組
C++11引入的std::tuple型別允許不同型別的值的聚合體用編譯器整型常數索引,C++14還允許使用型別代替常數索引,從多元組中獲取物件,若多元組含有多於一個這個型別的物件,將會產生一個編譯錯誤。

5、其它
std::make_unique可以像std::make_shared一樣使用,用於產生std::unique_ptr物件。
std::integral_constant增加了一個返回常量值的operator()過載。
全域性std::begin/std::end函式之外,增加了std::cbegin/std::cend函式,它們總是返回常量迭代器。