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では多くの新機能が導入された。次のリストは完全ではない可能性がある。
[=, this]operator <=>による三方比較for文内における追加変数の初期化typenameの必要性が除去される[[no_unique_address]] 、[[likely]]および[[unlikely]] explicit、明示的修飾子がブール式に依存できるようにするconstexpr:仮想関数、共用体、try および catch、dynamic_cast および typeid、std::pointer_traitsconstevalキーワードを使用した即時関数usingconstinitキーワードstd::make_sharedおよびstd::allocate_sharedstd::atomic<shared_ptr<T>>や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_shared2017年11月の秋の会議(アルバカーキ)でC++20ワーキングドラフトに適用された変更は次のとおりである:
operator <=>を使用した三方比較forステートメント内の追加変数の初期化std::atomic<shared_ptr<T>>やstd::atomic<weak_ptr<T>> )std::to_address2018年3月(ジャクソンビル)のC++20ワーキングドラフトに適用された変更は次のとおりである:
typenameの必要性の除去[[no_unique_address]] 、[[likely]]および[[unlikely]]<chrono>へのカレンダーとタイムゾーンの追加std::span(std::string_viewと類似するが、spanは参照されたシーケンスを変更可能である)<version>ヘッダ2018年6月の夏の会議(Rapperswil)でC++20ワーキングドラフトに適用された変更は次のとおりである:
memcpy()より冗長性が低く、コンパイラの内部を利用する能力が高いオブジェクト表現のビットキャストexplicit2018年11月の秋の会議(サンディエゴ)でC++20ワーキングドラフトに適用された変更は次のとおりである:
constevalキーワードを使用した即時関数2019年2月の冬の会議(コナ)でC++20ワーキングドラフトに適用された変更は次のとおりである:
2019年7月の夏の会議(ケルン)でC++20ワーキングドラフトに適用された変更は次のとおりである:
constinitキーワード-> Type return-type-requirements の削除)volatileを非推奨とした[[nodiscard]]の効果constexpr INVOKEstd::atomic_ref<T>、std::atomic<std::shared_ptr<T>>)<=>演算子を標準ライブラリに追加std::source_locationstd::string、std::vector)std::stop_tokenおよびjoinされるスレッド(std::jthread)2019年11月の秋の会議(ベルファスト)でのNBコメントの解決中に適用された変更には以下を含む:
operator==から分離されたため、ユーザー定義のoperator==許可しないという制限がなくなった。これにより、クラスタイプのNTTPの配列メンバーも許可される。<compare>がフリースタンディング実装で利用可能になったstd::spanのtypedefは、標準ライブラリの他の部分と一致するようにsize_typeからindex_typeに変更された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となった。