C++20

**C++20**は、プログラミング言語 C++ の標準規格 ISO/IEC 14882:2020 の通称である。C++17 の次のバージョンである。この規格は、2020年2月にプラハで開催された会議でWG21によって技術的に最終決定され、2020年9月4日に承認され、2020年12月に公開された。

C++20は、C++14やC++17と比べ新たな主要機能が追加されている。以下は、C++20に受け入れられるか、C++20に含めることが検討されている変更の一部のリストである[要更新]。

## 新機能
C++20では多くの新機能が導入された。次のリストは完全ではない可能性がある。 

### 言語
* コンセプト（簡潔な構文による）。 
* モジュール 
* 指示付き初期化子 （C99の機能、および一般的なG++拡張に基づく） 
* ラムダのキャプチャとしての`[=, this]` 
* ラムダのテンプレートパラメータリスト 
* 「宇宙船演算子」`operator &#x3C;=&#x3E;`による三方比較 
* 範囲ベース`for`文内における追加変数の初期化 
* 未評価コンテキストにおけるラムダ 
* デフォルトの構築可能で割り当て可能なステートレスラムダ 
* ラムダ*init-capture*でパック拡張を許可 
* テンプレートパラメータとしての文字列リテラル 
* 特定の状況で`typename`の必要性が除去される 
* 新しい標準属性``  、``および``  
* 条件付き`explicit`、明示的修飾子がブール式に依存できるようにする 
* 拡張された`constexpr`：仮想関数、共用体、try および catch、dynamic_cast および typeid、std::pointer_traits 
* 新しい`consteval`キーワードを使用した即時関数 
* 符号付き整数は、 2の補数を使用して表されるように定義された（符号付き整数オーバーフローは未定義の動作のままである）  
* 改訂された記憶モデル 
* 構造化バインディングのさまざまな改善（ラムダキャプチャとの相互作用、静的およびthread_localストレージ期間）  
* コルーチン  
* スコープ付き列挙型における`using` 
* `constinit`キーワード 

### ライブラリ
* 範囲（1つの範囲の提案） 
* 配列の`std::make_shared`および`std::allocate_shared` 
* アトミックスマートポインター（ `std::atomic<shared_ptr<T>>`や`std::atomic<weak_ptr<T>>` ） 
* ポインタを生ポインタに変換する`std::to_address` 
* `<chrono>`へのカレンダーとタイムゾーンの追加 
* 連続した配列へのビューを提供する`std::span`（`std::string_view`に類似するが、`span`は参照シーケンスを変更可能である）  
* `<version>`ヘッダー 
* オブジェクト表現の型キャストに使用される`std::bit_cast<>`。`memcpy()`よりも冗長度が低く、コンパイラの内部を利用しやすくなっている。 
* 機能テストマクロ 
* さまざまなconstexprライブラリビット 
* デフォルトの初期化によるスマートポインタの作成 
* `std::map::contains`メソッド 

### 非推奨の機能
* 添え字式でのカンマ演算子の使用は廃止予定である 
* （ほとんどの）`[[揮発性（コンピュータープログラミング） |volatile]]`は廃止予定である 

### 新しい（および変更された）キーワード
`concept`、`constinit`、`consteval`、`co_await`、`co_return`、`co_yield`、`requires`（加えて`export`の意味の変更）、および`char8_t`といった多くの新しいキーワード（および新規の「宇宙船演算子」`operator <=>`）が追加された。また、C++20以降、`explicit`は式を取ることができるようになった。`volatile`キーワードのほとんどの用法は廃止予定となった。 

キーワードに加えて、`import`や`module`など*、特別な意味を持つ識別子*が新しく加わった。 

C++20で新しく追加された属性：``、``、および``。 

## 変更の歴史
2017年7月（トロント）にC++20ワーキングドラフトに適用された変更は次のとおりである： 

* コンセプト 
* 指示付き初期化子 
* ラムダのキャプチャとしての`[=, this]` 
* ラムダのテンプレートパラメータリスト 
* 配列の`std::make_shared`および`std::allocate_shared` 

2017年11月の秋の会議（アルバカーキ）でC++20ワーキングドラフトに適用された変更は次のとおりである： 

* 「宇宙船演算子」`operator &#x3C;=&#x3E;`を使用した三方比較 
* 範囲ベースの`for`ステートメント内の追加変数の初期化 
* 未評価コンテキストにおけるラムダ 
* デフォルトの構築可能で割り当て可能なステートレスラムダ 
* ラムダ*init-capture*でパック拡張を許可する 
* テンプレートパラメータとしての文字列リテラル 
* アトミックスマートポインター（ `std::atomic<shared_ptr<T>>`や`std::atomic<weak_ptr<T>>` ） 
* ポインタを生ポインタに変換する`std::to_address` 

2018年3月（ジャクソンビル）のC++20ワーキングドラフトに適用された変更は次のとおりである： 

* 特定の状況における`typename`の必要性の除去 
* 新しい標準属性`` 、``および`` 
* `<chrono>`へのカレンダーとタイムゾーンの追加 
* 連続した配列へのビューを提供する`std::span`（`std::string_view`と類似するが、`span`は参照されたシーケンスを変更可能である） 
* `<version>`ヘッダ 

2018年6月の夏の会議（Rapperswil）でC++20ワーキングドラフトに適用された変更は次のとおりである： 

* 契約を今後の標準に延期 
* 機能テストマクロ 
* `memcpy()`より冗長性が低く、コンパイラの内部を利用する能力が高いオブジェクト表現のビットキャスト 
* 明示的修飾子がブール式に依存することを可能にする条件付き`explicit` 
* constexpr仮想関数

2018年11月の秋の会議（サンディエゴ）でC++20ワーキングドラフトに適用された変更は次のとおりである： 

* 範囲（1つの範囲の提案） 
* コンセプトの簡潔な構文 
* constexpr union、try および catch、dynamic_cast、typeid、std::pointer_traits。 
* さまざまなconstexprライブラリビット 
* 新しい`consteval`キーワードを使用した即時関数 
* 符号付き整数は、2の補数を使用して表されるように定義された（符号付き整数オーバーフローは未定義の動作のままである） 
* 契約機能の改善（契約条件でのアクセス制御） （今後の標準に延期された機能のリストを参照） 
* 改訂された記憶モデル 
* デフォルト初期化によるスマートポインタの作成

2019年2月の冬の会議（コナ）でC++20ワーキングドラフトに適用された変更は次のとおりである： 

* コルーチンClang 5ですでに実験的にサポートされていた 
* モジュールClang 5、Visual Studio 2015 Update 1、GCCで試験的にサポートされていた
* 構造化バインディングのさまざまな改善（ラムダキャプチャ、静的およびthread_localストレージ寿命との相互作用）

2019年7月の夏の会議（ケルン）でC++20ワーキングドラフトに適用された変更は次のとおりである：

* 契約が削除された（今後の標準に延期された機能のリストを参照）  
* 添え字式でのカンマ演算子の使用は非推奨となった 
* constexprへの追加（自明なデフォルト初期化、未評価のインラインアセンブリ） 
* スコープ付き列挙型のusing 
* 宇宙船演算子へのさまざまな変更 
* DR：モジュールへの軽微な変更 
* `constinit`キーワード 
* コンセプトに対する変更（ `-> Type` return-type-requirements の削除） 
* （ほとんどの）`volatile`を非推奨とした 
* DR：コンストラクタに対する``の効果 
* 新しい標準ライブラリのコンセプトはPascalCaseを使用しないこととなった（ほかの標準ライブラリと同様、standard_caseを使用する） 
* テキストのフォーマット（chronoの統合、特殊なケースにおける修正） 
* ビット操作 
* `constexpr INVOKE` 
* 数学定数 
* アトミックへの一貫性の追加（ `std::atomic_ref<T>`、`std::atomic<std::shared_ptr<T>>`） 
* `<=>`演算子を標準ライブラリに追加 
* 標準ライブラリのヘッダーユニット 
* 同期機能（マージ元：効率的なアトミック待機とセマフォ、ラッチとバリア、atomic_flagの改善、C++を小さいCPUで実装できないようにしない ） 
* `std::source_location` 
* constexprコンテナ（`std::string`、`std::vector`） 
* `std::stop_token`およびjoinされるスレッド（`std::jthread`）

2019年11月の秋の会議（ベルファスト）でのNBコメントの解決中に適用された変更には以下を含む： 

* 非タイプテンプレートパラメータ（NTTP）のクラスタイプ：テンプレート引数の等価性の意味が`operator==`から分離されたため、ユーザー定義の`operator==`許可しないという制限がなくなった。これにより、クラスタイプのNTTPの配列メンバーも許可される。 
* 浮動小数点型、ポインターと参照、および共用体とunionライクなクラス（無名共用体を含むクラス型）がNTTPとして許可されるようになった。 
* 関数IDに末尾のrequire句も含まれるようになった（P1971） 
* 制約された非テンプレート関数が削除された 
* `&#x3C;compare&#x3E;`がフリースタンディング実装で利用可能になった 
* `std::span`のtypedefは、標準ライブラリの他の部分と一致するように`size_type`から`index_type`に変更された 
* コンセプトの名前が、ケルンでの会議の結果に従って変更された。 
* 範囲に対するいくつかの修正と追加（P1456R1：移動のみのビュー、P1391R4：`std::string_view`に対する範囲コンストラクタ（文字のイテレーターペアからのコンストラクタ）、P1394R4：`std::span&#x3C;ref&#x3E;`に対する範囲コンストラクタ、P1870R1：`forwarding-range<T>`が微妙すぎる） 
* `std::atomic&#x3C;T&#x3E;`の初期化が変更され、デフォルトおよびリスト初期化で動作するようになった。`std::latch`および`std::barrier`は、新しいメンバ関数`max()`を通じて実装がサポートするスレッドの最大数を報告できるようになった。 
* `std::weak_equality`と`std::strong_equality`は使用されなくなったため削除された 
* `&#x3C;numeric&#x3E;`内のアルゴリズムが`constexpr`となった。 
* C++20の新機能または変更された機能の不足している機能テストマクロが追加されました 

## 技術仕様として公開されている機能
* 並列処理TS v2 （タスクブロックを含む） 
* ネットワーキングTS v1 
* リフレクションTS v1 

## 今後の標準に延期された機能
* 契約新しい提案に取り組むために新しい研究グループ（SG21）が形成された 
* リフレクション 
* メタクラス  
* Executors 
* 非同期、基本的なI/Oサービス、タイマー、バッファ、バッファ指向ストリーム、ソケット、インターネットプロトコル（executorによってブロックされる）を含むネットワーク拡張 
* プロパティ 
* 拡張されたFuture 

## 脚注

## 関連項目
* C++ 
* C++98 
* C++03 
* C++11 
* C++14 
* C++17 
* C++23 
* C11 (C言語) 
* C17 (C言語) 
* C23 (C言語) 

## 外部リンク
* JTC1/SC22/WG21ISO/IEC C++標準作業グループ（別名C++標準委員会） 
* Ranges（range-v3）githubリポジトリ、Eric Niebler作