概要
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を追加std::chrono::durationの、各時間単位を表す、以下のリテラルを追加std::complexの、各要素型を表す、以下のリテラルを追加
並行処理
- Readers-writer lockと呼ばれる、書き込みを行うユーザーが1人、読み込みを行うユーザーが複数いる状況で効率的に振る舞うミューテックスの実装として、
<shared_mutex>ヘッダを追加