ISO委員会は「C ++ 20」規格を承認しました





最近、C ++言語の標準化のためのISO委員会(はい、1つあります)国際標準「C ++ 20」を承認しました仕様に示されている機能は、GCC、Clang、およびMicrosoft Visual C ++コンパイラによってサポートされています。さらに、「C ++ 20」をサポートする標準ライブラリが、Boostプロジェクト内に実装されています。



次のステップは、公開するドキュメントを準備することです。その後、11月初旬に、最終バージョンがISOに送信され、その後、正式な名前ISO / IEC 14882:2020で公開されます。委員会はすでに次の標準であるC ++ 23(C ++ 2b)に取り組んでいます。カットの下で-コード例を含む「C ++ 20」の機能。



新着情報?



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



 template<typename T>
   concept EqualityComparable = requires(T a, T b) {
       { a == b } -> std::boolean;
       { a != b } -> std::boolean;
   };


モジュールを操作するための承認された拡張ヘッダーファイルの代わりに使用できます。モジュールは、「#include」を使用してヘッダーファイルを含めることなく、コンポーネント境界の定義に基づいてソースを編成する新しい方法を提供します。バリアディック引数のトークンの存在に応じてバリアディック



マクロを適応拡張するための__VA_OPT__マクロ追加されました3者間比較の



ための<=>演算子のサポートが追加されましたビットフィールドのデフォルトの要素



初期化子サポートされています。ラムダ式をキャプチャ



する機能追加されました*これ。



   struct int_value {
     int n = 0;
     auto getter_fn() {
       // BAD:
       // return [=]() { return n; };
 
       // GOOD:
       return [=, *this]() { return n; };
     }
   };
 


クラスはタイプレステンプレートパラメータを使用できるようになりました



   struct foo {
     foo() = default;
     constexpr foo(int) {}
   };
 
   template <foo f>
   auto get_foo() {
     return f; 
   }
 
   get_foo(); // uses implicit constructor
   get_foo<foo{123}>();


これで、テンプレートパラメータで文字列リテラルを使用できます。Cスタイルの初期化構文がサポートされています。フィールド初期化リストに明示的にリストされていないものは、デフォルトで初期化されます。



struct A {
     int x;
     int y;
     int z = 123;
   };
 
   A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2


データ構造の空のメンバーがサポートされています。条件付きステートメントがトリガーされる確率についてオプティマイザーに通知するために



、可能性のある属性と可能性の低い属性がサポートされています( "[[likely]] if(random> 0){")。



これで、範囲を使用してforループで変数値を初期化できます



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


即時関数サポートされており、定数でのみ機能します。



 consteval int sqr(int n) {
     return n * n;
   }
 
   constexpr int r = sqr(100); // OK
   int x = 100;
   int r2 = sqr(x); // ERROR:  'x'     


ライブラリに追加:

  • 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 :: to_array関数。配列のようなオブジェクトをstd :: arrayに変換します。


列挙構文がより便利になりました。

   enum class rgba_color_channel { red, green, blue, alpha };
 
   std::string_view to_string(rgba_color_channel my_channel) {
     switch (my_channel) {
       using enum rgba_color_channel;
       case red:   return "red";
       case green: return "green";
       case blue:  return "blue";
       case alpha: return "alpha";
    }
   }


インデックスで操作 "、"( "a [b、c]")使用することは禁止されています標準タイプでの禁止された++および-操作を含む、violateキーワードで宣言された変数に対するほとんどの操作はサポートされていません。






All Articles