ここ数週間、C++ 委員会がオウルで開催され、C++17 の最終機能が決定され、それが国際標準になろうとしています。ジャクソンビルでの前回の会議の後、私は C++17 が大きな驚きをもたらすとはあまり期待していませんでしたが、オウルの会議では、新しい C++17 標準にいくつかの重要で興味深い機能を追加するために熱心に取り組みました。 Reddit ページでは C++17 機能の概要が詳しく説明されており、Herb Sutter 氏も最近の CppCast サイト (および彼の旅行レポート) で C++17 機能についての優れた洞察を提供しています。さらに、Michael Wong は C++17 機能のより完全な概要を提供します。
最初に重要なことについて話しましょう
前にも言ったように、ジャクソンビルでの会議の後、C++17 の多くの機能が非常に明確になりました。私は、C++17 に移行するかどうかに関するアドバイスを提供する 3 部構成のブログ シリーズを書きました。私たちは C++ の新世紀に入り、関連する標準が強力な技術仕様とともにリリースされ、次世代の C++ 標準の一部となるでしょう。これは、C++17 以外の機能 (コンセプトやモジュールなど) が、今後のコンパイラ リリースでプラグインとして利用可能になることを意味します。現在、Visual Studio はモジュールを提供していますが、GCC はこの概念をサポートする最初のコンパイラーです。 Clang はモジュールもサポートしており、Visual Studio と Clang の両方が間もなくモジュール TS ベースの仕様を実装する予定です。
そして、次の 2 つの会議では主に、さまざまな国内グループ (別名 ISO メンバー代表団) によって提起されたコメント、フィードバック、問題のいくつかを扱うことになると考えています。 C++ 標準では新しいコンテンツは追加されませんが、多かれ少なかれ変更が加えられます。しかし、私はこれらすべての機能が最終審査で合格することを願っています。
C++17 の最後のハイライト
std::variant
私が最も驚いたこと、バリアントから始めましょう。はい、真剣に、C++17 は std::variant を導入します。これは素晴らしいことであり、バリアントやその他の関連アイデアに基づいた将来の機能への道を開きます。たとえば、スタイル マッチングについては、C++ で非常に優れた説明があります。 David Sankel 氏によると、std::variant は boost::variant やその他のバリアント ライブラリの後に設計されています。 boost::variant とよく似た API
variant<int, float> v, w; v = 12;int i = get<int>(v); w = get<int>(v); w = get<0>(v); // same effect as the previous linew = v; // same effect as the previous lineget<double>(v); // ill formedget<3>(v); // ill formedtry { get<float>(w); // will throw.}catch (bad_variant_access&) {}
TS 迂回を採用する代わりに、この機能が C++17 標準に含まれていることを非常に嬉しく思います。
if constexpr(expression)
これは (ほぼ) static if の C++ バージョンです。私にとって、これはジャクソンビルのハイライトの 1 つでしたが、当時はそれほど人気がありませんでした。期待に応え、Oulu による C++17 の最終レビューに合格しました。これにより、コンパイル中に constexpr が true と評価された場合、C++ は特定のステートメント ブロックを簡単にコンパイルできます:
if constexpr (std::is_integer ...) { //integerstuff } else if constexpr (std::is_floating_point ...) { //floatingpointstuff } else { // NaN ;) }
この例は、constexpr がコンパイル中に true として評価される必要があることを明示的に示しています。 True ですが、static_assert には影響しません。ステートメント ブロック内の選択されていない static_asserts は引き続きトリガーされます。これは規格としては不適切です。
もう 1 つの興味深い点: この機能は if constexpr として記述されていますが、標準のスペルでは引き続き constexpr if という名前が付けられていますが、if constexpr のように定義されています。
テンプレートで auto を使用する
C++14 では、匿名式で auto を使用してジェネリック パラメーターを定義できます。現在、auto を使用して (型以外の) テンプレート パラメーターを定義することもできます。 auto は class や typename よりも短いため、テンプレート コードの記述が容易になります。 auto を使用して、可変長のテンプレート パラメーターを定義することもできます (例: template
構造化バインディング
これまで、結果の型を手動で処理することなく、std::tie を使用してタプルまたは異なる変数のペアを直接割り当てるというのが有名な手法でした。これはトリックであり、変数が存在する必要があります。これで、変数を 1 行で宣言して初期化できます。
auto [a , b , c] = getvalues();
括弧が欠落していてはなりません。getvalues はタプルを返します。推奨事項には std::pair についての言及がないため、pair の使用も適切に機能するかどうかは不明ですが、一部の挿入メソッドでは STL によって返されます。
ifと初期化で切り替える
変数は if ステートメントで定義できるようになりました: if(int x = 42; true != false)。これは前の提案と組み合わせることができます。 if ステートメントで定義された変数は、その else 部分でも有効です。最近の C++ の設計では、これを実現するために中かっこのようなトリックが提案されていたのを覚えていますが、それは単一の変数に対するものでした。
if や switch のロックなど、このケースを使用するのは興味深いことです。これらの関数によって返されるすべてのステータス コードは、if 内で処理できるようになりました。本質的に、これは { var x = value; if(...){}else{}} と書くのと同じです。
その他
これがすべてではありません。たとえば、コピー省略 (コピー削除) の改善のため、std[0-9]+ の名前空間は将来の標準用に予約されています。また、reddit には興味深い議論や意見がたくさんあります。
C++ 17 標準は徐々に開発および改善されており、標準化されたツールも成熟して使用されています。これは C++ にとって最大の利点です。次の C++ 標準に貢献したい人は、今すぐ計画を立て始めるとよいでしょう。 C++ の標準化は常にボランティアによって推進されてきましたが、これを行うための資金はなく、基本的には誰もが日々の仕事を C++ に関連している人たちです。 isocpp.org をチェックすることをお勧めします。これには、参加できるさまざまなメーリング リストやワーキング グループもあります。
上記は C++17 の最終機能の内容です。さらに関連する内容については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。