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>やstd::atomic<weak_ptr<T>> )
ポインタを生ポインタに変換するstd::to_address
<chrono>へのカレンダーとタイムゾーンの追加
連続した配列へのビューを提供するstd::span(std::string_viewに類似するが、spanは参照シーケンスを変更可能である)
<version>ヘッダー
オブジェクト表現の型キャストに使用されるstd::bit_cast<>。memcpy()よりも冗長度が低く、コンパイラの内部を利用しやすくなっている。
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>や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
(サンディエゴ)でC++20ワーキングドラフトに適用された変更は次のとおりである:
範囲(1つの範囲の提案)
constexpr union、try および catch、dynamic_cast、typeid、std::pointer_traits。
新しいconstevalキーワードを使用した即時関数
符号付き整数は、2の補数を使用して表されるように定義された(符号付き整数オーバーフローは未定義の動作のままである)
契約機能の改善(契約条件でのアクセス制御) (今後の標準に延期された機能のリストを参照)
(コナ)でC++20ワーキングドラフトに適用された変更は次のとおりである:
コルーチンsndClang 5ですでに実験的にサポートされていた
モジュールsndClang 5、Visual Studio 2015 Update 1、GCCで試験的にサポートされていた
構造化バインディングのさまざまな改善(ラムダキャプチャ、静的およびthread_localストレージ寿命との相互作用)
(ケルン)でC++20ワーキングドラフトに適用された変更は次のとおりである:
契約が削除された(今後の標準に延期された機能のリストを参照)
constexprへの追加(自明なデフォルト初期化、未評価のインラインアセンブリ)
DR:モジュールへの軽微な変更
constinitキーワード
コンセプトに対する変更( -> Type return-type-requirements の削除)
(ほとんどの)volatileを非推奨とした
DR:コンストラクタに対するnodiscardの効果
新しい標準ライブラリのコンセプトはPascalCaseを使用しないこととなった(ほかの標準ライブラリと同様、standard_caseを使用する)
テキストのフォーマット(chronoの統合、特殊なケースにおける修正)
constexpr INVOKE
アトミックへの一貫性の追加( std::atomic_ref<T>、std::atomic>)
<=>演算子を標準ライブラリに追加
同期機能(マージ元:効率的なアトミック待機とセマフォ、ラッチとバリア、atomic_flagの改善、C++を小さいCPUで実装できないようにしない )
std::source_location
constexprコンテナ(std::string、std::vector)
std::stop_tokenおよびjoinされるスレッド(std::jthread)
(ベルファスト)での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に対する範囲コンストラクタ、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
契約snd新しい提案に取り組むために新しい研究グループ(SG21)が形成された
非同期、基本的なI/Oサービス、タイマー、バッファ、バッファ指向ストリーム、ソケット、インターネットプロトコル(executorによってブロックされる)を含むネットワーク拡張