C++14

C++14是C++的現行標準的非正式名稱，正式名稱為"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在作為C++11的一個小擴充，主要提供漏洞修復和小的改進。C++14標準的委員會草案（Committee Draft）N3690於2013年5月15日發表。工作草案（Working Draft）N3936已於2014年3月2日完成。最終的投票期結束於2014年8月15日，結果（一致通過）已於8月18日公布。

新的語言特性

以下為在C++14中被加入語言核心的特性。

泛型的lambda

在C++11中，lambda函式的形式參數需要被聲明為具體的類型。C++14放寬了這一要求，允許lambda函式的形式參數聲明中使用類型說明符auto。
auto lambda = [](auto x, auto y) {return x + y;}
泛型lambda函式遵循模板參數推導的規則。以上程式碼的作用與下面的程式碼相同：
struct unnamed_lambda{
  template<typename T, typename U>
    auto operator()(T x, U y) const {return x + y;}};auto lambda = unnamed_lambda{};

Lambda捕獲部分中使用運算式

C++11的lambda函式通過值拷貝（by copy）或參照（by reference）捕獲（capture）已在外層作用域聲明的變數。這意味著lambda捕獲的變數不可以是move-only的類型。 C++14允許lambda成員用任意的被捕獲運算式初始化。這既允許了capture by value-move，也允許了任意聲明lambda的成員，而不需要外層作用域有一個具有相應名字的變數。這稱為廣義捕獲(Generalized capture)。即在捕獲子句（capture clause）中增加並初始化新的變數，該變數不需要在lambda運算式所處的閉包域（enclosing scope）中存在；即使在閉包域中存在也會被新變數覆蓋(override)。新變數類型由它的初始化運算式推導。用途是可以從外層作用域中捕獲只供移動的變數並使用它。
這是通過使用一個初始化運算式完成的：
auto lambda = [value = 1] {return value;}
lambda函式lambda的返回值是1，說明value被初始化為1。被聲明的捕獲變數的類型會根據初始化運算式推斷，推斷方式與用auto聲明變數相同。
使用標準函式std::move可以使之被用以通過move捕獲：
auto ptr = std::make_unique<int>(10); //See below for std::make_uniqueauto lambda = [value = std::move(ptr)] {return *value;}

函式返回類型推導

C++11允許lambda函式根據return語句的運算式類型推斷返回類型。C++14為一般的函式也提供了這個能力。C++14還拓展了原有的規則，使得函式體並不是{return expression;}形式的函式也可以使用返回類型推導。
為了啟用返回類型推導，函式聲明必須將auto作為返回類型，但沒有C++11的後置返回類型說明符：
auto DeduceReturnType();   //返回类型由编译器推断
如果函式實現中含有多個return語句，這些運算式必須可以推斷為相同的類型。
使用返回類型推導的函式可以前向聲明，但在定義之前不可以使用。它們的定義在使用它們的翻譯單元（translation unit）之中必須是可用的。
這樣的函式中可以存在遞迴，但遞迴呼叫必須在函式定義中的至少一個return語句之後：
auto Correct(int i) {
  if (i == 1)
    return i;               // 返回类型被推断为int
  else
    return Correct(i-1)+i;  // 正确，可以调用}auto Wrong(int i){
  if(i != 1)
    return Wrong(i-1)+i;  // 不能调用，之前没有return语句
  else
    return i;             // 返回类型被推断为int}

另一種類型推斷

C++11中有兩種推斷類型的方式。auto根據給出的運算式產生具有合適類型的變數。decltype可以計算給出的運算式的類型。但是，decltype和auto推斷類型的方式是不同的。特別地，auto總是推斷出非參照類型，就好像使用了std::remove_reference一樣，而auto&&總是推斷出參照類型。然而decltype可以根據運算式的值類別（value category）和運算式的性質推斷出參照或非參照類型：
int i;int&& f();auto x3a = i;              // x3a的类型是intdecltype(i) x3d = i;       // x3d的类型是intauto x4a = (i);            // x4a的类型是intdecltype((i)) x4d = (i);   // x4d的类型是int&auto x5a = f();            // x5a的类型是intdecltype(f()) x5d = f();   // x5d的类型是int&&
C++14增加了decltype(auto)的語法。允許auto的類型聲明使用decltype的規則。也即，允許不必顯式指定作為decltype參數的運算式，而使用decltype對於給定運算式的推斷規則。
decltype(auto)的語法也可以用於返回類型推導，只需用decltype(auto)代替auto。

變數模板

在C++之前的版本中，模板可以是函式模板或類別範本（C++11引入了類型別名模板）。C++14現在也可以建立變數模板。在提案中給出的範例是變數pi，其可以被讀取以獲得各種類型的pi的值（例如，當被讀取為整數類型時為3;當被讀取為float,double,long double時，可以是近似float，double或long double精度的值）包括特化在內，通常的模板的規則都適用於變數模板的聲明和定義。
template<typename T>constexpr T pi = T(3.141592653589793238462643383);// 适用于特化规则 :template<>constexpr const char* pi<const char*> = "pi";

聚合類別成員初始化

C++11增加了default member initializer，如果建構函式沒有初始化某個成員，並且這個成員擁有default member initializer，就會用default member initializer來初始化成員。聚合類（aggregate type）的定義被改為明確排除任何含有default member initializer的類類型，因此，如果一個類含有default member initializer，就不允許使用聚合初始化。
C++14放鬆了這一限制，含有default member initializer的類型也允許聚合初始化。如果在定義聚合體類型的物件時，使用的花括號初始化列表沒有指定該成員的值，將會用default member initializer初始化它。
struct CXX14_aggregate {
    int x;
    int y = 42;};CXX14_aggregate a = {1}; // C++14允许。a.y被初始化为42

二進位字面量

C++14的數字可以用二進位形式指定。其格式使用字首0b或0B。這樣的語法也被Java、Python、Perl和D語言使用。

數字分位符

C++14引入單引號（'）作為數字分位符號，使得數值型的字面量可以具有更好的可讀性。
Ada、D語言、Java、Perl、Ruby等程式設計語言使用底線（_）作為數字分位符號，C++之所以不和它們保持一致，是因為底線已被用在用戶自訂的字面量的語法中。
auto integer_literal = 100'0000;auto floating_point_literal = 1.797'693'134'862'315'7E+308;auto binary_literal = 0b0100'1100'0110;auto silly_example = 1'0'0'000'00;

deprecated 屬性

deprecated屬性允許標記不推薦使用的實體，該實體仍然能合法使用，但會讓用戶注意到使用它是不受歡迎的，並且可能會導致在編譯期間輸出警告訊息。 deprecated可以有一個可選的字串文字作為參數，以解釋棄用的原因和/或建議替代者。
[[deprecated]] int f();[[deprecated("g() is thread-unsafe. Use h() instead")]]void g( int& x );void h( int& x );void test() {
  int a = f(); // 警告：'f'已弃用
  g(a); // 警告：'g'已弃用：g() is thread-unsafe. Use h() instead}

共用的互斥體和鎖

C++14增加了一類共用的互斥體和相應的共用鎖。起初選擇的名字是std::shared_mutex，但由於後來增加了與std::timed_mutex相似的特性，std::shared_timed_mutex成為了更適合的名字。

元函式的別名

C++11定義了一組元函式，用於查詢一個給定類型是否具有某種特徵，或者轉換給定類型的某種特徵，從而得到另一個類型。後一種元函式通過成員類型type來返迴轉換後的類型，當它們用在模板中時，必須使用typename關鍵字，這會增加程式碼的長度。
template <class T>type_object<
  typename std::remove_cv<
    typename std::remove_reference<T>::type
  >::type>get_type_object(T&);
利用類型別名模板，C++14提供了更便捷的寫法。其命名規則是：如果標準庫的某個類別範本（假設為std::some_class）只含有唯一的成員，即成員類型type，那麼標準庫提供std::some_class_t<T>作為typename std::some_class::type的別名。
在C++14，擁有類型別名的元函式包括：remove_const、remove_volatile、remove_cv、add_const、add_volatile、add_cv、remove_reference、add_lvalue_reference、add_rvalue_reference、make_signed、make_unsigned、remove_extent、remove_all_extents、remove_pointer、add_pointer、aligned_storage、aligned_union、decay、enable_if、conditional、common_type、underlying_type、result_of、tuple_element。
template <class T>type_object<std::remove_cv_t<std::remove_reference_t<T>>>get_type_object(T&);

關聯容器中的異構尋找

C++標準庫定義了四個關聯容器類。set和multiset允許使用者根據一個值在容器中尋找對應的的同類型的值。map和multimap容器允許使用者指定鍵（key）和值（value）的類型，根據鍵進行尋找並返回對應的值。然而，尋找只能接受指定類型的參數，在map和multimap中是鍵的類型，而在set和multiset容器中就是值本身的類型。
C++14允許通過其他類型進行尋找，只需要這個類型和實際的鍵類型之間可以進行比較操作。這允許std::set<std::string>使用const char*，或任何可以通過operator< 與std::string比較的類型作為尋找的參數。
為保證向下相容性，這種異構尋找只在提供給關聯容器的比較器允許的情況下有效。標準庫的泛型比較器，如std::less<>與std::greater<>允許異構尋找。

通過類型尋址多元組

C++11引入的std::tuple類型允許不同類型的值的聚合體用編譯期整型常數索引。C++14還允許使用類型代替常數索引，從多元組中取得物件。若多元組含有多於一個這個類型的物件，將會產生一個編譯錯誤：
tuple<string, string, int> t("foo", "bar", 7);int i = get<int>(t);        // i == 7int j = get<2>(t);          // Same as before: j == 7string s = get<string>(t);  //Compiler error due to ambiguity

較小的標準庫特性

std::make_unique可以像std::make_shared一樣使用，用於產生std::unique_ptr物件。
std::is_final，用於辨識一個class類型是否禁止被繼承。
std::integral_constant增加了一個返回常數值的operator()。
全域std::begin/std::end函式之外，增加了std::cbegin/std::cend函式，它們總是返回常數疊代器（constant iterators）。

已被移除或是不包含在C++14標準的特性

因為C++14的主要目的是漏洞修復和小的改進，一些重量級的特性被從C++14中移除，其中有部分將加入C++17標準。

關於陣列的擴充

在C++11和之前的標準中，在堆疊上分配的陣列被限制為擁有一個固定的、編譯期確定的長度。這一擴充允許在堆疊上分配的一個陣列的最後一維具有執行期確定的長度。
執行期確定長度的陣列不可以作為物件的一部分，也不可以具有全域儲存期，他們只能被聲明為局部變數。執行期確定長度的陣列也可以使用C++11的基於範圍的for迴圈。
同時還將添加std::dynarray類型，它擁有與std::vector和std::array相似的介面。代表一個固定長度的陣列，其大小在執行期構造物件時確定。std::dynarray類被明顯地設計為當它被放置在棧上時（直接放置在棧上，或作為另一個棧物件的成員），可以使用棧記憶體而不是堆記憶體。
由於一些設計無法達成一致，這一擴充已被放棄。

Optional值

類似於C#中的可空類型，optional類型可能含有或不含有一個值。這一類型基於Boost的boost::optional類，而添加了C++11和C++14中的新特性，諸如移動和in-place構造。它不允許用在參照類型上。這個類被專門的設計為一個literal type（如果模板參數本身是一個literal type），因此，它在必要的情況下含有constexpr建構函式。

Concepts Lite

被C++11拒絕後，Concepts受到徹底的修改。Concepts Lite是Concepts的一個部分，僅包含類型約束，而不含concept_map和axiom。 ISO/IEC TS 19217:2015 Information technology -- Programming languages -- C++ Extensions for concepts已出版。