最近、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キーワードで宣言された変数に対するほとんどの操作はサポートされていません。