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 <=>による三方比較 
 範囲ベースfor文内における追加変数の初期化 
 未評価コンテキストにおけるラムダ  
 デフォルトの構築可能で割り当て可能なステートレスラムダ 
 ラムダinit-captureでパック拡張を許可 
 テンプレートパラメータとしての文字列リテラル 
 特定の状況でtypenameの必要性が除去される 
 新しい標準属性[[no_unique_address]]  、[[likely]]および[[unlikely]]  
 条件付き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で新しく追加された属性：[[likely]]、[[unlikely]]、および[[no_unique_address]]。

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

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

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

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

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

 特定の状況におけるtypenameの必要性の除去 
 新しい標準属性[[no_unique_address]] 、[[likely]]および[[unlikely]] 
 <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：コンストラクタに対する[[nodiscard]]の効果 
 新しい標準ライブラリのコンセプトは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） 
 制約された非テンプレート関数が削除された 
 <compare>がフリースタンディング実装で利用可能になった 
 std::spanのtypedefは、標準ライブラリの他の部分と一致するようにsize_typeからindex_typeに変更された 
 コンセプトの名前が、ケルンでの会議の結果に従って変更された。 
 範囲に対するいくつかの修正と追加（P1456R1：移動のみのビュー、P1391R4：std::string_viewに対する範囲コンストラクタ（文字のイテレーターペアからのコンストラクタ）、P1394R4：std::span<ref>に対する範囲コンストラクタ、P1870R1：forwarding-range<T>が微妙すぎる） 
 std::atomic<T>の初期化が変更され、デフォルトおよびリスト初期化で動作するようになった。std::latchおよびstd::barrierは、新しいメンバ関数max()を通じて実装がサポートするスレッドの最大数を報告できるようになった。 
 std::weak_equalityとstd::strong_equalityは使用されなくなったため削除された 
 <numeric>内のアルゴリズムが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言語） 
 C18（C言語）

参考文献

外部リンク 

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

C++