フィンランドのオウルにおけるミーティングで、ISO C++委員会はC++17のフィーチャーリスト定義を完了した。ミーティングでは、多数の新たな言語機能とライブラリ機能が承認された。これにはconstexpr if
、template <auto>
、構造化束縛などが含まれる。
委員会メンバーのJens Weller氏によると、これでフィーチャーリストはクローズされ、レビュー期間が始まるという。
次の2回のミーティングでは、主に、各国機関によってなされたレビュー、フィードバック、課題について扱います。標準に新たなものを追加することはありませんが、マイナーもしくはメジャーな変更が加わる可能性があります。
オウルでの委員会ミーティングでC++17に追加されたフィーチャーのうち、Weller氏は以下に注目している。
-
std::variant
: 安全で汎用のスタックベースの判別共用体コンテナ。 -
if constexpr(expression)
: コンパイル時if
のC++バージョンとみなせる。この機能によって様々な可能性が開かれるとHerb Sutter氏は強調する。例えば、テンプレートの特殊化をすることなく、本体内にアルゴリズムの特殊ケースをすべて含んだ関数テンプレートが書けるなど。
-
Template
auto
:auto
を使って非型テンプレート引数を宣言できる。例えば、以下のように書ける。template <auto value> void f() { } f<10>(); // int だと推論
-
構造化束縛: タプルから複数の変数を宣言して初期化できる。
tuple<T1,T2,T3> get_tuple(); auto [a , b , c] = get_tuple();
-
if
とswitch
における変数宣言: すでにfor
ループで許されているのと同様にする。map<int,string> mymap; if (auto result = mymap.insert(value); result.second) { // 成功時の処理を入れる、resultはこのブロックで有効 use(result.first); // ok // ... }
加えて、Sutter氏は注目する価値のある新機能について、次のものに触れている。
- オーバーアラインしたデータの動的メモリ割当
- 保証されたコピー省略: ローカル変数を初期化するのに値によって返されたオブジェクトを使うとき、コンパイラはC++11で生じていた余計なコピーやムーブを行わなくなる。
上記リストは、先日の委員会ミーティングで新たに承認された機能しか含んでいない。C++17標準に新たに含まれるフィーチャーリストはもっと長い。レビュープロセスの終了時に新しい標準に何が含まれるのか、その全体像を把握するには、このStack Overflowスレッドが役立つだろう。
Rate this Article
- Editor Review
- Chief Editor Action