C++20規格承認済み

C++ 言語の標準化に関する ISO 委員会 承認済み 国際標準 "C ++ 20」。 仕様に記載されている機能は、例外的なケースを除き、 サポートされている コンパイラ内 GCC, クラン и Microsoft Visual C ++。 C++20をサポートする標準ライブラリがプロジェクト内に実装されています ブースト.

今後 14882 か月以内に、承認された仕様は出版に向けて文書を準備する段階に入り、スペルミスやタイプミスの編集上の修正作業が行われます。 2020 月初旬に、結果として得られた文書は ISO/IEC 23:2 という正式名で出版するために ISO に送信されます。 その一方で、委員会はすでに次の C++XNUMX 標準 (C++XNUMXb) の作業を開始しており、次回の仮想会議で考えられるオプションを検討する予定です。 イノベーション.

メイン 特徴 C ++ 20 (コード例):

  • テンプレート拡張機能である「概念」を追加しました。これにより、コンパイル時にテンプレート パラメーターとして受け入れられる引数のセットを制限する、テンプレート パラメーター要件のセットを定義できるようになります。 この概念を使用すると、テンプレート内で使用されるデータ型のプロパティと入力パラメーターのデータ型プロパティの間の論理的不一致を回避できます。

    テンプレート
    概念 EqualityComparable = require(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • 承認されました エクステンション ヘッダー ファイルの代わりに使用できるモジュールを操作する場合に使用します。 モジュールは、「#include」によってヘッダー ファイルをインクルードすることなく、コンポーネントの境界の定義に基づいてソース コードを整理する新しい方法を提供します。
  • 変数引数内のトークンの存在に応じて変数マクロを適応的に展開するためのマクロ __VA_OPT__。
  • 三者比較のための "" 演算子のサポート。
  • ビットフィールドのデフォルト要素初期化子のサポート。
  • 「*this」式をラムダ キャプチャする機能。

    構造体 int_value {
    int n = 0;
    auto getter_fn() {
    //悪い:
    // return [=]() { return n; };

    // 良い:
    return [=, *this]() { return n; };
    }
    };

  • 「const &」式で定義された一時オブジェクトへのポインターを使用して、ポインター (メンバーへのポインター) によって要素を呼び出します。
  • ドキュメントに記載されているデストラクターを含む削除演算子 P0722R1.
  • クラスは、型のないテンプレート パラメーターを使用できます。

    構造体 foo {
    foo() = デフォルト;
    constexpr foo(int) {}
    };

    テンプレート
    自動 get_foo() {
    f を返します。
    }

    get_foo(); // 暗黙的なコンストラクターを使用します
    get_foo ();

  • コンストラクターを使用した非永続ラムダ式。
  • ラムダ式のテンプレート構文を許可します (“auto f = [] (std::vector v)」)。
  • テンプレートパラメータで文字列リテラルを使用できるようになりました。
  • C スタイルの初期化構文のサポート - 初期化リストに明示的にリストされていないフィールドはデフォルトで初期化されます。

    構造体A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // ax == 1、ay == 0、az == 2

  • 空のデータ構造メンバーのサポート。
  • 条件付き構文がトリガーされる確率をオプティマイザに通知する、可能性の高い属性と可能性の低い属性のサポート (「[[likely]] if (random > 0) {」)。
  • 「for」ループで範囲を使用して変数値を初期化する機能

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • new の配列サイズの自動計算 (“new double[]{1,2,3}”);
  • データのない変数がスペースを占有しない「[[no_unique_address]]」属性。
  • アトミック ポインター (std::atomic > および std::atomic >)。
  • 条件式で仮想関数を呼び出す機能。
  • 定数のみを扱う即時関数のサポート。

    consteval int sqr(int n) {
    n * n を返します。
    }

    constexpr int r = sqr(100); // わかりました
    整数 x = 100;
    int r2 = sqr(x); // エラー: 'x' は定数として使用できません

  • 仮想関数で constexpr を使用できるようになりました (「constexpr virtual int f() const { return 2; }」)。
  • 標準ライブラリでは次のようになります。
    • UTF-8 文字列の char8_t タイプのサポートが追加されました。
    • ヘッダー ファイルのビット (ビット操作) とバージョンを追加しました。
    • 文字列のプレフィックスとサフィックス(starts_with、ends_with)を確認できるようになりました。
    • std::remove_cvref、std::unwrap_reference、std::unwrap_decay_ref、std::is_nothrow_convertible、および std::type_identity 特性を追加しました。
    • 関数 std::midpoint、std::lerp、std::bind_front、std::source_location、std::visit、std::is_constant_evaluated、および std::assume_aligned が追加されました。
    • std::make_shared に配列のサポートが追加されました。
    • 配列のようなオブジェクトを std::array に変換する std::to_array 関数を追加しました。
  • より便利な列挙構文:

    enum クラス rgba_color_channel { 赤、緑、青、アルファ };

    std::string_view to_string(rgba_color_channel my_channel) {
    スイッチ (my_channel) {
    enum rgba_color_channel を使用します。
    赤の場合: 「赤」を返します。
    緑の場合: 「緑」を返します。
    青の場合: 「青」を返します。
    アルファの場合: 「アルファ」を返します。
    }
    }

  • インデックスでは、動作が未定義であるため、演算「,」(「a[b,c]」)の使用は禁止されています。 標準型の「++」および「-」演算を含む、volatile キーワードで宣言された変数を使用するほとんどの演算のサポートが廃止されました。
  • 型の存在を示すために「typename」が必要になる状況の数が減りました。

出所: オープンネット.ru

コメントを追加します