C++ 言語の標準化に関する ISO 委員会
今後 14882 か月以内に、承認された仕様は出版に向けて文書を準備する段階に入り、スペルミスやタイプミスの編集上の修正作業が行われます。 2020 月初旬に、結果として得られた文書は ISO/IEC 23:2 という正式名で出版するために ISO に送信されます。 その一方で、委員会はすでに次の C++XNUMX 標準 (C++XNUMXb) の作業を開始しており、次回の仮想会議で考えられるオプションを検討する予定です。
- テンプレート拡張機能である「概念」を追加しました。これにより、コンパイル時にテンプレート パラメーターとして受け入れられる引数のセットを制限する、テンプレート パラメーター要件のセットを定義できるようになります。 この概念を使用すると、テンプレート内で使用されるデータ型のプロパティと入力パラメーターのデータ型プロパティの間の論理的不一致を回避できます。
テンプレート
概念 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