トップQs
タイムライン
チャット
視点
C++20
C++17の次期バージョンとされるC++の非公式名称 ウィキペディアから
Remove ads
C++20 は、プログラミング言語 C++ の標準規格 ISO/IEC 14882:2020 [1]の通称である[2]。C++17 の次のバージョンである。この規格は、2020年2月にプラハで開催された会議でWG21によって技術的に最終決定[3]され[4]、2020年9月4日に承認され、2020年12月に公開された。
C++20は、C++14やC++17と比べ新たな主要機能が追加されている[5]。以下は、C++20に受け入れられるか、C++20に含めることが検討されている変更の一部のリストである。[6] [要更新]
新機能
要約
視点
C++20では多くの新機能が導入された。次のリストは完全ではない可能性がある。
言語
- コンセプト[7](簡潔な構文による)[8]。
- モジュール[9]
- 指示付き初期化子[10] (C99の機能、および一般的なG++拡張に基づく)
- ラムダのキャプチャとしての
[=, this]
[11] - ラムダのテンプレートパラメータリスト[12]
- 「宇宙船演算子」
operator <=>
による三方比較 - 範囲ベース
for
文内における追加変数の初期化[13] - 未評価コンテキストにおけるラムダ[14] [15]
- デフォルトの構築可能で割り当て可能なステートレスラムダ[16]
- ラムダinit-captureでパック拡張を許可[17]
- テンプレートパラメータとしての文字列リテラル[18]
- 特定の状況で
typename
の必要性が除去される[19] - 新しい標準属性
[[no_unique_address]]
[20] 、[[likely]]
および[[unlikely]]
[21] - 条件付き
explicit
、明示的修飾子がブール式に依存できるようにする[22] - 拡張された
constexpr
:仮想関数[23]、共用体[24]、try および catch[25]、dynamic_cast および typeid[26]、std::pointer_traits[27] - 新しい
consteval
キーワードを使用した即時関数[28] - 符号付き整数は、 2の補数を使用して表されるように定義された(符号付き整数オーバーフローは未定義の動作のままである) [29]
- 改訂された記憶モデル[30]
- 構造化バインディングのさまざまな改善(ラムダキャプチャとの相互作用、静的およびthread_localストレージ期間) [31] [32]
- コルーチン [33]
- スコープ付き列挙型における
using
[34] constinit
キーワード[35]
ライブラリ
- 範囲(1つの範囲の提案)[36]
- 配列の
std::make_shared
およびstd::allocate_shared
[37] - アトミックスマートポインター(
std::atomic<shared_ptr<T>>
やstd::atomic<weak_ptr<T>>
)[38] - ポインタを生ポインタに変換する
std::to_address
[39] <chrono>
へのカレンダーとタイムゾーンの追加[40]- 連続した配列へのビューを提供する
std::span
(std::string_view
に類似するが、span
は参照シーケンスを変更可能である) [41] <version>
ヘッダー[42]- オブジェクト表現の型キャストに使用される
std::bit_cast<>
。memcpy()
よりも冗長度が低く、コンパイラの内部を利用しやすくなっている[43]。 - 機能テストマクロ[44]
- さまざまなconstexprライブラリビット[45]
- デフォルトの初期化によるスマートポインタの作成[46]
std::map::contains
メソッド[47]
非推奨の機能
新しい(および変更された)キーワード
concept
、constinit
[35]、consteval
、co_await
、co_return
、co_yield
、requires
(加えてexport
の意味の変更)、およびchar8_t
といった多くの新しいキーワード(および新規の「宇宙船演算子」operator <=>
)が追加された[50]。また、C++20以降、explicit
は式を取ることができるようになった[51]。volatile
キーワードのほとんどの用法は廃止予定となった[49]。
キーワードに加えて、import
やmodule
など、特別な意味を持つ識別子が新しく加わった。
C++20で新しく追加された属性:[[likely]]
、[[unlikely]]
、および[[no_unique_address]]
[52]。
Remove ads
変更の歴史
要約
視点
2017年7月(トロント)にC++20ワーキングドラフトに適用された変更は次のとおりである:[53]
- コンセプト
- 指示付き初期化子
- ラムダのキャプチャとしての
[=, this]
- ラムダのテンプレートパラメータリスト
- 配列の
std::make_shared
およびstd::allocate_shared
2017年11月の秋の会議(アルバカーキ)でC++20ワーキングドラフトに適用された変更は次のとおりである:[54] [55]
- 「宇宙船演算子」
operator <=>
を使用した三方比較 - 範囲ベースの
for
ステートメント内の追加変数の初期化 - 未評価コンテキストにおけるラムダ
- デフォルトの構築可能で割り当て可能なステートレスラムダ
- ラムダinit-captureでパック拡張を許可する
- テンプレートパラメータとしての文字列リテラル
- アトミックスマートポインター(
std::atomic<shared_ptr<T>>
やstd::atomic<weak_ptr<T>>
) - ポインタを生ポインタに変換する
std::to_address
2018年3月(ジャクソンビル)のC++20ワーキングドラフトに適用された変更は次のとおりである:[56]
- 特定の状況における
typename
の必要性の除去[57] - 新しい標準属性
[[no_unique_address]]
[58]、[[likely]]
および[[unlikely]]
[59] <chrono>
へのカレンダーとタイムゾーンの追加[60]- 連続した配列へのビューを提供する
std::span
(std::string_view
と類似するが、span
は参照されたシーケンスを変更可能である)[61] <version>
ヘッダ[62]
2018年6月の夏の会議(Rapperswil)でC++20ワーキングドラフトに適用された変更は次のとおりである:[63]
- 契約を今後の標準に延期[64]
- 機能テストマクロ[65]
memcpy()
より冗長性が低く、コンパイラの内部を利用する能力が高いオブジェクト表現のビットキャスト[66]- 明示的修飾子がブール式に依存することを可能にする条件付き
explicit
[67] - constexpr仮想関数[68]
2018年11月の秋の会議(サンディエゴ)でC++20ワーキングドラフトに適用された変更は次のとおりである:
- 範囲(1つの範囲の提案)
- コンセプトの簡潔な構文
- constexpr union、try および catch、dynamic_cast、typeid、std::pointer_traits。
- さまざまなconstexprライブラリビット[69]
- 新しい
consteval
キーワードを使用した即時関数[70] - 符号付き整数は、2の補数を使用して表されるように定義された(符号付き整数オーバーフローは未定義の動作のままである)[71]
契約機能の改善(契約条件でのアクセス制御)[72] (今後の標準に延期された機能のリストを参照)- 改訂された記憶モデル[73]
- デフォルト初期化によるスマートポインタの作成[74]
2019年2月の冬の会議(コナ)でC++20ワーキングドラフトに適用された変更は次のとおりである:[75] [76]
- コルーチン[77] – Clang 5ですでに実験的にサポートされていた[78]
- モジュール[79] – Clang 5[80]、Visual Studio 2015 Update 1[81]、GCC[82]で試験的にサポートされていた[83]
- 構造化バインディングのさまざまな改善(ラムダキャプチャ、静的およびthread_localストレージ寿命との相互作用)[84] [85]
2019年7月の夏の会議(ケルン)でC++20ワーキングドラフトに適用された変更は次のとおりである:[86] [87] [88]
- 契約が削除された(今後の標準に延期された機能のリストを参照) [89]
- 添え字式でのカンマ演算子の使用は非推奨となった[90]
- constexprへの追加(自明なデフォルト初期化[91]、未評価のインラインアセンブリ[92])
- スコープ付き列挙型のusing[93]
- 宇宙船演算子へのさまざまな変更[94][95]
- DR:モジュールへの軽微な変更[96]
constinit
キーワード- コンセプトに対する変更(
-> Type
return-type-requirements の削除[97]) - (ほとんどの)
volatile
を非推奨とした[49] - DR:コンストラクタに対する
[[nodiscard]]
の効果[98] - 新しい標準ライブラリのコンセプトはPascalCaseを使用しないこととなった(ほかの標準ライブラリと同様、standard_caseを使用する)[99]
- テキストのフォーマット[100][101](chronoの統合[102]、特殊なケースにおける修正[103])
- ビット操作[104]
constexpr INVOKE
[105]- 数学定数[106]
- アトミックへの一貫性の追加(
std::atomic_ref<T>
[107]、std::atomic<std::shared_ptr<T>>
[108]) <=>
演算子を標準ライブラリに追加[109]- 標準ライブラリのヘッダーユニット[110]
- 同期機能[111](マージ元:効率的なアトミック待機とセマフォ[112]、ラッチとバリア[113]、atomic_flagの改善[114]、C++を小さいCPUで実装できないようにしない[115] )
std::source_location
[116]- constexprコンテナ(
std::string
[117]、std::vector
[118]) std::stop_token
およびjoinされるスレッド(std::jthread
)[119]
2019年11月の秋の会議(ベルファスト)でのNBコメントの解決中に適用された変更には以下を含む:[120][121][122]
- 非タイプテンプレートパラメータ(NTTP)のクラスタイプ:テンプレート引数の等価性の意味が
operator==
から分離されたため、ユーザー定義のoperator==
許可しないという制限がなくなった[123]。これにより、クラスタイプのNTTPの配列メンバーも許可される。 - 浮動小数点型[124]、ポインターと参照、および共用体とunionライクなクラス(無名共用体を含むクラス型)がNTTPとして許可されるようになった。
- 関数IDに末尾のrequire句も含まれるようになった(P1971)
- 制約された非テンプレート関数が削除された
<compare>
がフリースタンディング実装で利用可能になった[125]std::span
のtypedefは、標準ライブラリの他の部分と一致するようにsize_type
からindex_type
に変更された[126]- コンセプトの名前が、ケルンでの会議の結果に従って変更された。
- 範囲に対するいくつかの修正と追加(P1456R1:移動のみのビュー[127]、P1391R4:
std::string_view
に対する範囲コンストラクタ(文字のイテレーターペアからのコンストラクタ)[128]、P1394R4:std::span<ref>
に対する範囲コンストラクタ[129]、P1870R1:forwarding-range<T>
が微妙すぎる[130]) std::atomic<T>
の初期化が変更され、デフォルトおよびリスト初期化で動作するようになった[131]。std::latch
およびstd::barrier
は、新しいメンバ関数max()
を通じて実装がサポートするスレッドの最大数を報告できるようになった。std::weak_equality
とstd::strong_equality
は使用されなくなったため削除された<numeric>
内のアルゴリズムがconstexpr
となった。- C++20の新機能または変更された機能の不足している機能テストマクロが追加されました[132]
Remove ads
技術仕様として公開されている機能
今後の標準に延期された機能
関連項目
参考文献
外部リンク
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads