C++14とは、2014年12月に改訂され、ISO/IEC 14882:2014で標準規格化されたC++バージョンの通称である。
前バージョンであるC++11からマイナーバージョンアップされ、小さな機能拡張が行われた。
このバージョンは、策定中はC++1yと呼ばれていた。前バージョンであるC++11が策定中、C++0xと呼ばれていたことから、「xの次」という意味で「y」が使われていた。
言語機能 | 説明 |
---|---|
2進数リテラル | 2進数を表す0b or 0B プレフィックスを付けた数値リテラルの記述を可能とする |
通常関数の戻り値型推論 | 関数の戻り値型をauto にすることで、return 文から戻り値の型を推論させる |
decltype(auto) |
decltype の規則による変数の型推論 |
後置戻り値型をプレースホルダーにすることを許可 | 戻り値の型を後置する関数宣言構文とラムダ式の戻り値型にauto を使用できるようにする |
ラムダ式の初期化キャプチャ | キャプチャに代入構文を導入し、一つの変数に複数のキャプチャ方法を指定可能にする |
ジェネリックラムダ | ラムダ式のパラメータをauto にすることで、ジェネリックな関数呼び出し演算子を持つ関数オブジェクトを生成する |
変数テンプレート | 変数定義時のテンプレート指定を可能にする |
constexpr の制限緩和 |
if 文、switch 文による条件分岐の許可。for 文、while 文、do-while 文によるループの許可。void 戻り値型の許可初期化を伴う変数宣言の許可。 変数書き換えの許可 |
宣言時のメンバ初期化を持つ型の集成体初期化を許可 | 集成体において、宣言時に初期化されているメンバを持つことを許可する |
ネストする集成体初期化における波カッコ省略を許可 | 一様初期化と初期化子リストを組み合わせた際、二重に波カッコが必要となっていた仕様を緩和し、波カッコを省略できるようにする |
[[deprecated]] 属性 |
非推奨の機能であることを示す属性 |
数値リテラルの桁区切り文字 | シングルクォーテーションで数値リテラルを桁区切りする |
サイズ付きデアロケーション | サイズをとるdelete 演算子のオーバーロードを許可する |
動的メモリ確保の省略の許可 | デフォルトの::operator new による動的メモリ確保を省略したりまとめたりする事を許可する |
ここでは、コア言語作業グループへ問題報告され、その解決策として導入された言語仕様の変更を解説する。
言語機能 | 説明 |
---|---|
更新された定義済みマクロ | 標準規格で定義されたマクロの更新 |
機能テストマクロ | C++14 の機能がサポートされているかどうかをテストするためのマクロ |
リテラル演算子のスペースを省略可能とする | operator"" とサフィックス名の間にスペースを入力しなくてもよくなった |
nullptr_t 型の定数式を非型テンプレートパラメータとすることを許可 |
nullptr_t 型の値をテンプレート引数として渡せるようになった |
- 順序付き連想コンテナのルックアップ処理で、一時オブジェクトが生成されるコストを抑える拡張が行われた
std::map::find()
std::map::count()
std::map::lower_bound()
std::map::upper_bound()
std::map::equal_range()
std::map
クラスのほか、std::set
、std::multiset
、std::multimap
の上記メンバ関数も対象
- Forward Iteratorを値初期化した場合に、どこも指さないヌルイテレータになる、という規定が追加された(参照 : N3644 Null Forward Iterators)
- 以下のアルゴリズムに、2つ目の範囲の終端イテレータをパラメータにとるバージョンを追加。これにより、2つの範囲が同じ長さかを事前にユーザーがチェックする必要がなくなった
- 乱数生成を行うアルゴリズム、
std::rand()
とstd::random_shuffle()
を非推奨とする。std::rand()
の代わりに<random>
ヘッダで定義される乱数生成器と分布クラスを、std::random_shuffle()
の代わりにstd::shuffle()
を使用すること
std::unique_ptr
を生成するヘルパ関数std::make_unique()
を追加
- 文字列をクォート修飾する
std::quoted
マニピュレータを追加
- 2つの値を入れ替える関数
std::exchange()
を追加 - コンパイル時整数シーケンス
std::integer_sequence
を追加 - タプルを型の集合と見なし、型を指定して対応する値を取得する
std::get()
のオーバーロードを追加 <type_traits>
ヘッダの、メンバ型type
を定義するクラステンプレートに、エイリアステンプレート版を追加。そのバージョンには、_t
サフィックスが付く
std::basic_string
のリテラル演算子s
を追加"hello"s
は、文字コード未規定のstd::string
オブジェクトを表すリテラルL"hello"s
は、文字コード未規定のstd::wstring
オブジェクトを表すリテラルu8"hello"s
は、UTF-8文字コードのstd::string
オブジェクトを表すリテラルu"hello"s
は、UTF-16文字コードのstd::u16string
オブジェクトを表すリテラルU"hello"s
は、UTF-32文字コードのstd::u32string
オブジェクトを表すリテラル
std::chrono::duration
の、各時間単位を表す、以下のリテラルを追加std::complex
の、各要素型を表す、以下のリテラルを追加
- Readers-writer lockと呼ばれる、書き込みを行うユーザーが1人、読み込みを行うユーザーが複数いる状況で効率的に振る舞うミューテックスの実装として、
<shared_mutex>
ヘッダを追加