1. 程式人生 > >C++14新特性總結

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“完全實現了當前草案的所有內容”;GCCVisual Studio也對C++14的新特性提供了一些支援。