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に含めることが検討されている変更の一部のリストである。 [要更新]

1. 新機能
------

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

1.1. 言語
-------

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

1.2. ライブラリ
----------

範囲
配列のstd::make_sharedおよびstd::allocate_shared
アトミックスマートポインター
ポインタを生ポインタに変換するstd::to_address
へのカレンダーとタイムゾーンの追加
連続した配列へのビューを提供するstd::span
ヘッダー
オブジェクト表現の型キャストに使用されるstd::bit_cast<>。memcpyよりも冗長度が低く、コンパイラの内部を利用しやすくなっている。
機能テストマクロ
さまざまなconstexprライブラリビット
デフォルトの初期化によるスマートポインタの作成
std::map::containsメソッド

1.3. 非推奨の機能
-----------

添え字式でのカンマ演算子の使用は廃止予定である
volatileは廃止予定である

1.4. 新しいキーワード
-------------

concept、constinit、consteval、co_await、co_return、co_yield、requires、およびchar8_tといった多くの新しいキーワードが追加された。また、C++20以降、explicitは式を取ることができるようになった。volatileキーワードのほとんどの用法は廃止予定となった。

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

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

2. 変更の歴史
--------

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

コンセプト
指示付き初期化子
ラムダのキャプチャとしての[=, this]
ラムダのテンプレートパラメータリスト
配列のstd::make_sharedおよびstd::allocate_shared2017年11月の秋の会議でC++20ワーキングドラフトに適用された変更は次のとおりである：

「宇宙船演算子」operator <=>を使用した三方比較
範囲ベースのforステートメント内の追加変数の初期化
未評価コンテキストにおけるラムダ
デフォルトの構築可能で割り当て可能なステートレスラムダ
ラムダ//init-capture//でパック拡張を許可する
テンプレートパラメータとしての文字列リテラル
アトミックスマートポインター
ポインタを生ポインタに変換するstd::to_address2018年3月のC++20ワーキングドラフトに適用された変更は次のとおりである：

特定の状況におけるtypenameの必要性の除去
新しい標準属性 、および
へのカレンダーとタイムゾーンの追加
連続した配列へのビューを提供するstd::span
ヘッダ2018年6月の夏の会議でC++20ワーキングドラフトに適用された変更は次のとおりである：

契約を今後の標準に延期
機能テストマクロ
memcpyより冗長性が低く、コンパイラの内部を利用する能力が高いオブジェクト表現のビットキャスト
明示的修飾子がブール式に依存することを可能にする条件付きexplicit
constexpr仮想関数[1]でC++20ワーキングドラフトに適用された変更は次のとおりである：

範囲
コンセプトの簡潔な構文
constexpr union、try および catch、dynamic_cast、typeid、std::pointer_traits。
さまざまなconstexprライブラリビット
新しいconstevalキーワードを使用した即時関数
符号付き整数は、2の補数を使用して表されるように定義された
契約機能の改善
改訂された記憶モデル
デフォルト初期化によるスマートポインタの作成[2]でC++20ワーキングドラフトに適用された変更は次のとおりである：

コルーチンClang 5ですでに実験的にサポートされていた
モジュールClang 5、Visual Studio 2015 Update 1、GCCで試験的にサポートされていた
構造化バインディングのさまざまな改善 [3]でC++20ワーキングドラフトに適用された変更は次のとおりである：

契約が削除された
添え字式でのカンマ演算子の使用は非推奨となった
constexprへの追加
スコープ付き列挙型のusing
宇宙船演算子へのさまざまな変更
DR：モジュールへの軽微な変更
constinitキーワード
コンセプトに対する変更
volatileを非推奨とした
DR：コンストラクタに対するの効果
新しい標準ライブラリのコンセプトはPascalCaseを使用しないこととなった
テキストのフォーマット
ビット操作
constexpr INVOKE
数学定数
アトミックへの一貫性の追加
<=>演算子を標準ライブラリに追加
標準ライブラリのヘッダーユニット
同期機能
std::source_location
constexprコンテナ
std::stop_tokenおよびjoinされるスレッド[4]でのNBコメントの解決中に適用された変更には以下を含む：

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

3. 技術仕様として公開されている機能
-------------------

並列処理TS v2
ネットワーキングTS v1
リフレクションTS v1

4. 今後の標準に延期された機能
----------------

契約新しい提案に取り組むために新しい研究グループが形成された
リフレクション
メタクラス
Executors
非同期、基本的なI/Oサービス、タイマー、バッファ、バッファ指向ストリーム、ソケット、インターネットプロトコルを含むネットワーク拡張
プロパティ
拡張されたfuture

5. 関連項目
-------

C++
C++98
C++03
C++11
C++14
C++17
C++23
C11
C18

6. 参考文献
-------

7. 外部リンク
--------

[5]ISO/IEC C++標準作業グループ
Rangesgithubリポジトリ、Eric Niebler作