C++11に続くC++標準であるC++14の最終承認が完了し,年内の公開に向けてISOに提出された。C++の生みの親であるBjarne Stroustrup氏によると,C++14の改善内容はC++11に比べて "意識的に小さくなっている"が,それでも"ユーザに対する重要な利便性が追加された"ことで,C++を"より初心者向けに"する方向に踏み出しているという。
C++のタイムライン上でのC++14は,C++11標準で開発された作業を完結するマイナリリースという位置付けにあり,よりクリーンでシンプル,高速な言語にすることを目標としている。新しい言語機能は,次回のC++17標準に託されている。
C++14の主要機能は3つのグループに分類できる。ラムダ関数,constexpr,そして型推論だ。
ラムダ関数
C++14のジェネリックラムダは次のように記述可能だ。
auto lambda = [](auto x, auto y) {return x + y;};
C++11のラムダパラメータでは,次のように,ラムダパラメータの型を明確に宣言する必要があった。
int lambda = [](int x, int y) {return x + y;};
さらに新標準のstd::move
関数を使えば,オブジェクトをコピーや参照する代わりに移動することによって,ラムダ式内の変数をキャプチャすることができる。
std::unique_ptrptr(new int(10)); auto lambda = [value = std::move(ptr)] {return *value;};
Constexpr
constexpr
で宣言された関数は,コンパイル時に実行して値を生成することができる。整数を引数とするテンプレートのインスタンス化のように,定数式の必要な場所で使用可能だ。C++11のconstexpr
では単一式を含めることしかできなかったが,C++14ではこの制限が緩和されて,if
やswitch
などの条件文,範囲ベースのfor
ループなどのループが使用できるようになる。
型推論
C++11ではラムダ式のみであった戻り値の型推論が,C++14ではすべての関数で可能になる。
auto DeducedReturnTypeFunction();
ただしC++14は強い型付け言語であるため,いくつかの制限を考慮に入れなければならない。
- 関数の実装に複数のreturn文がある場合,それらはすべて同じ型を推論するものでなければならない。
- 戻り値型の推論は前方宣言でも使用可能だが,その関数が使用されるよりも前に,変換ユニットが関数宣言を使用できることが必要だ。
- 戻り値の型推論は再帰関数でも使用可能だが,戻り値の型を推論できるように,再帰呼び出しよりも前に少なくともひとつのreturn文がなくてはならない。
C++14の提供する型推論の改善としてはもうひとつ,decltype(auto)
構文がある。これはauto
と同じ機構を使用して,指定された式の型を算出可能にするものだ。auto
とdecltype
はいずれもC++11にすでにあったものだが,型推論に使用する機構が違っていたため,最終的に生成する結果が異なっている場合があった。
その他のC++14の変更点としては,テンプレート化された変数の宣言が可能になったこと,0b
あるいは0B
を接頭辞とした2進数リテラルが使用可能になったことなどがある。InfoQでは以前,C++11プログラムと非互換の可能性があるC++14の変更についてレポートしている。
主要なC++コンパイラは現在,新言語機能のサポートを進めているところだ。"現行ドラフトを完全に実装している"Clangの他,GCCやVisual Studioでも,C++14のいくつかの新機能がサポートされている。