C++ 14 新特性總結
C++14 這一繼C++11 之後的新的 C++ 標準已經被正式批准,正在向 ISO 提交,將於年內釋出。C++之父 Bjarne Stroustrup 說道,儘管與C++11 相比,C++14 的改進“有意做的比較小”,但是仍然為使用者“帶來了極大的方便”,是實現使C++“對新手更為友好”這一目標的步驟之一。
在 C++ 的時間表中,C++14 按計劃是一個小版本,完成制定C++11 標準的剩餘工作,目的是使 C++ 成為一門更清晰、更簡單和更快速的語言。新的語言特性留到了未來的C++17 標準中。
C++14 的主要特性可以分為三個領域:Lambda 函式、constexpr 和型別推導。
Lambda 函式
C++14 的泛型 Lambda 使編寫如下語句成為可能:
auto lambda = [](auto x, auto y) {return x + y;};
而另一方面,C++11 要求 Lambda 引數使用具體的型別宣告,比如:
auto lambda = [](int x, int y) {return x + y;};
此外,新標準中的 std::move 函式可用於捕獲 Lambda 表示式中的變數,這是通過移動物件而非複製或引用物件實現的:
std::unique_ptr ptr (new int (10));auto lambda = [value = std::move (ptr)] {return *value;};
constexpr
在C++11 中,使用 constexpr 宣告的函式可以在編譯時執行,生成一個值,用在需要常量表示式的地方,比如作為初始化模板的整形引數。C++11 的 constexpr 函式只能包含一個表示式,C++14 放鬆了這些限制,支援諸如 if 和 switch 等條件語句,支援迴圈,其中包括基於區間(range)的 for 迴圈。
型別推導
C++11 僅支援 Lambda 函式的型別推導,C++14 對其加以擴充套件,支援所有函式的返回型別推導:
auto DeducedReturnTypeFunction ();
因為C++14 是強型別語言,有些限制需要考慮:
- 如果一個函式的實現中有多個返回語句,這些語句一定要推匯出同樣的型別。
- 返回型別推導可以用在前向宣告中,但是在使用它們之前,翻譯單元中必須能夠得到函式定義。
- 返回型別推導可以用在遞迴函式中,但是遞迴呼叫必須以至少一個返回語句作為先導,以便編譯器推匯出返回型別。
C++14 帶來的另一個型別推導方面的改進是 decltype (auto)語法,它支援使用與 auto 同樣的機制計算給定表示式的型別。auto 和 decltype 在C++11 中就已經出現了,但是它們在推導型別時使用了不同的機制,這可能會產生不同的結果。
C++14 中的其他改變包括可以宣告變數模板,支援使用 0b 或 0B 字首來宣告二進位制字面常量。InfoQ 已經介紹過C++14 中可能破壞C++11 程式的其他小型修改。
主流 C++ 編譯器對新語言特性的支援正在有條不紊地開發:Clang“完全實現了當前草案的所有內容”;GCC 和 Visual Studio 也對C++14 的新特性提供了一些支援。
相關文章
- c++ 11 14 17 20後的新特性總結二:無序容器、元組、正規表示式C++
- html5新特性總結HTML
- css3新特性總結CSSS3
- ES6新特性總結
- React 16 新特性使用總結React
- JDK1.8新特性總結JDK
- C++新特性C++
- PHP 各個版本新特性總結PHP
- 個人總結(css3新特性)CSSS3
- C++11新特性總結 (二)C++
- C++11新特性總結 (一)C++
- C# 6.0 的新特性總結C#
- C++ 2.0新特性C++
- C++的新特性C++
- Java8常用的新特性總結Java
- Java 新特性總結——簡單實用Java
- iOS 12正式版新特性總結iOS
- JDK8新特性學習總結JDK
- ES6常用的新特性總結
- 【Java】jdk1.8新特性及用法總結JavaJDK
- react-router v6新特性總結React
- es6新語法新特性總結(上)
- JDK 1.5 - 1.8 各版本的新特性總結JDK
- Java9的新特性的總結Java
- 總結:JDK1.5-JDK1.8各個新特性JDK
- JAVA8 新特性實際使用總結(一)Java
- C++ 11 新特性之容器相關特性C++
- C++ 11 新特性之ClassC++
- Oracle特性總結Oracle
- es6、7、8、9新語法新特性-總結
- 開發者必讀:Oracle 12c新特性再總結Oracle
- Oracle 資料庫12c新特性總結(一)Oracle資料庫
- Java 8新特性:lambda表示式(四)轉載總結Java
- 總結CSS3新特性(媒體查詢篇)CSSS3
- rman總結(包含10g rman中的新特性)
- 高質量C/C++程式設計指南總結(八)—— C++高階特性C++程式設計
- C++ 11 新特性 nullptr 學習C++Null
- C++各版本引入的新特性C++