C++17のフィーチャーリストが完成、レビューに入る

フィンランドのオウルにおけるミーティングで、ISO C++委員会はC++17のフィーチャーリスト定義を完了した。ミーティングでは、多数の新たな言語機能とライブラリ機能が承認された。これにはconstexpr iftemplate <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();
    
  • ifswitchにおける変数宣言: すでにforループで許されているのと同様にする。

    map<int,string> mymap;
    if (auto result = mymap.insert(value); result.second) {
    // 成功時の処理を入れる、resultはこのブロックで有効
    use(result.first);  // ok
    // ...
    }
    

加えて、Sutter氏は注目する価値のある新機能について、次のものに触れている。

上記リストは、先日の委員会ミーティングで新たに承認された機能しか含んでいない。C++17標準に新たに含まれるフィーチャーリストはもっと長い。レビュープロセスの終了時に新しい標準に何が含まれるのか、その全体像を把握するには、このStack Overflowスレッドが役立つだろう。