C ++ 20


C++20

C ++ 20はバージョンであるISO / IECのための14882標準C ++プログラミング言語。C ++ 20は、C ++ 17と呼ばれる以前のバージョンのC ++標準に取って代わりました。規格は技術的に完成された、2020年2月プラハでの会議で、WG21によっては2020年9月4日、上で承認された 12月2020年に発表された

コンテンツ
1 特徴
1.1 言語 1.2 としょうかん 1.3 新規および変更されたキーワード 1.4 削除され、非推奨
2 技術仕様として公開
3 後の標準に延期
4 コンパイラのサポート
5 歴史
6 参考文献
7 外部リンク

特徴
C ++ 20は、C ++ 14またはC ++ 17よりも多くの新しい主要機能を追加します。 C ++ 20に受け入れられた変更は次のとおりです。

言語
概念、簡潔な構文
モジュール
指定された初期化子(C99機能および一般的なg ++拡張に基づく)
ラムダキャプチャとして
ラムダのテンプレートパラメータリスト
「宇宙船演算子」を使用した宇宙船比較、operator <=>
範囲ベースのforステートメント内の追加変数の初期化
未評価のコンテキストでのラムダ
デフォルトの構築可能で割り当て可能なステートレスラムダ
lambdainit-captureでパック拡張を許可する パラメータとしての文字列リテラル
typename特定の状況での必要性を取り除く
新しい標準属性[[no_unique_address]]、 []および[]
条件付きexplicit、明示的な修飾子がブール式を条件とすることを可能にします
拡張constexpr:仮想関数、 union、 try and catch、 dynamic_castおよびtypeid、 std :: pointer_traits
新しいconstevalキーワードを使用した即時関数
符号付き整数は、2の補数を使用して表されるように定義されるようになりました(符号付き整数のオーバーフローは未定義の動作のままです)
改訂されたメモリモデル
構造化バインディングのさまざまな改善(ラムダキャプチャとの相互作用、静的およびthread_localストレージ期間)
コルーチン
usingスコープ付き列挙型
constinitキーワード

としょうかん
範囲(1つの範囲の提案)
std::make_sharedおよびstd::allocate_sharedアレイの場合
アトミックスマートポインタ(std::atomic>およびなどstd::atomic>)
std::to_addressポインタを生のポインタに変換する
へのカレンダーとタイムゾーンの追加
std::span、隣接する配列へのビューを提供します(参照されたシーケンスに類似してstd::string_viewいspanますが、変異する可能性があります)
std::eraseそしてstd::erase_if、ほとんどの標準的なコンテナの要素消去を簡素化します
ヘッダー
std::bit_cast<>オブジェクト表現の型キャスト用で、memcpy()コンパイラ内部よりも冗長性が低く、コンパイラ内部を活用する能力があります。
機能テストマクロ
さまざまなconstexprライブラリビット
デフォルトの初期化によるスマートポインタの作成
std::map::contains方法
先頭/末尾のゼロ/ 1カウントなどのビット演算およびlog2演算
std::bind_front

新規および変更されたキーワード
追加多くの新しいキーワード(および新しい”宇宙船演算子”、operator <=>など)、 、、concept 、(プラス変更の意味)、および(のためのUTF-8をサポート)。そしてC ++ 20以降の式を取ることができます。キーワードの使用のほとんどは非推奨になりました。constinit constevalco_awaitco_returnco_yieldrequiresexportchar8_texplicitvolatile
キーワードに加えて、newや。などの特別な意味を持つ識別子がimportありmoduleます。
:新はC ++ 20の属性[]、[]および[[no_unique_address]]

削除され、非推奨
削除された機能:
Cは、ヘッダーの由来彼らはC ++には目的を果たしていないとして、削除されました。(<*.h>Cとの互換性のために、対応するヘッダーは残ります。)
throw()例外仕様としての使用は削除されました。
std::uncaught_exception、、、など、以前 std::raw_storage_iteratorに廃止されたライブラリ機能の一部が削除されましstd::is_literal_typeた。std::is_literal_type_vstd::result_ofstd::result_of_t
非推奨の機能:
添え字式でのコンマ演算子の使用は非推奨になりました(ほとんど)volatileは非推奨になりました

技術仕様として公開
Parallelism TS v2 (タスクブロックを含む)
リフレクションTSv1
ネットワーキングTSv1

後の標準に延期
契約–新しい提案に取り組むために新しい研究グループ(SG21)が結成されました
反射
メタクラス
遺言執行者
ネットワーク拡張、 非同期、基本的なI / Oサービス、タイマー、バッファー、バッファー指向のストリーム、ソケット、インターネットプロトコル(エグゼキューターによってブロックされる)を含む
プロパティ
拡張先物

コンパイラのサポート
Clang-std=c++20は部分的なC ++ 20をサポートしており、オプション(バージョン10以降)または-std=c++2a(バージョン9以前)で有効にできます。
EDGeccpはバージョン5.0でC ++ 20機能の実装を開始し、バージョン6.1以降、ほとんどのC ++ 20コア言語機能をサポートしています。
GCCは、オプションを使用して、バージョン8の2017 で部分的な実験的なC ++ 20サポートを追加しまし-std=c++2aた。Clangと同様に、GCCはこのオプションをバージョン10で置き換えまし-std=c++20た。また、実験的なC ++ 20サポートに加えて、GNU拡張機能を有効にするオプションもあります-std=gnu++20。
Visual Studio 2019/std:c++latestは、バージョン16.10.0以降、そのオプションを通じてすべてのC ++ 20機能をサポートします。 C ++ 20モードを有効にするオプション/std:c++20がバージョン16.11.0で追加されました。

歴史
2017年7月(トロント)にC ++ 20ワーキングドラフトに適用された変更には、次のものが
コンセプト(標準化されたのは縮小版です。「ConceptsLite」とも呼ばれます)
指定された初期化子
ラムダキャプチャとして
ラムダのテンプレートパラメータリスト
std::make_sharedおよびstd::allocate_sharedアレイの場合
2017年11月の秋の会議(アルバカーキ)でC ++ 20ワーキングドラフトに適用された変更には、次のものが
「宇宙船演算子」を使用した宇宙船比較、operator <=>
範囲ベースのforステートメント内の追加の変数の初期化
未評価のコンテキストでのラムダ
デフォルトの構築可能で割り当て可能なステートレスラムダ
lambdainit-captureでパック拡張を許可するパラメータとしての文字列リテラル
アトミックスマートポインタ(やstd::atomic>などstd::atomic>)
std::to_address ポインタを生のポインタに変換するには
2018年3月(ジャクソンビル)にC ++ 20ワーキングドラフトに適用された変更には、次のものが
typename特定の状況での必要性を取り除く
新しい標準属性[[no_unique_address]]、[]および[]
カレンダーとタイムゾーンの追加
std::span、隣接する配列へのビューを提供します(参照されるシーケンスに類似してstd::string_viewいますが、変更できます)span
ヘッダ
2018年6月の夏季会議(ラッパースウィル)でC ++ 20ワーキングドラフトに適用された変更には、次のものが
契約(後で後の標準に延期される)
機能テストマクロ
オブジェクト表現のビットキャスティング。memcpy()コンパイラ内部を活用するよりも冗長性が低く、より多くの機能を備えています。
条件付きexplicit、明示的な修飾子をブール式に依存させることができます
constexpr仮想関数
2018年11月の秋の会議(サンディエゴ)でC ++ 20ワーキングドラフトに適用された変更には、次のものが
範囲(1つの範囲の提案)
概念の簡潔な構文
constexpr union、try and catch、dynamic_cast、typeid、std :: pointer_traits。
さまざまなconstexprライブラリビット
consteval新しいキーワードを使用した即時機能
符号付き整数は、 2の補数を使用して表されるように定義されるようになりました(符号付き整数のオーバーフローは未定義の動作のままです)
契約機能の改良(契約条件でのアクセス制御) (後の標準に延期された機能のリストを参照)
改訂されたメモリモデル
デフォルトの初期化によるスマートポインタの作成
2019年2月の冬季会議(コナ)でC ++ 20ワーキングドラフトに適用された変更には、次のものが
コルーチン
モジュール
構造化バインディングのさまざまな改善(ラムダキャプチャとの相互作用、静的およびthread_localストレージ期間)
2019年7月の夏季会議(ケルン)でC ++ 20ワーキングドラフトに適用された変更には、次のものが
契約は削除されました(後の標準に延期された機能のリストを参照)
添え字式でのコンマ演算子の使用は非推奨になりました
constexprの追加(簡単なデフォルトの初期化、未評価のインラインアセンブリ)
スコープ付き列挙型の使用
宇宙船オペレーターへのさまざまな変更
DR:モジュールへのマイナーな変更
constinit キーワード
概念の変更(-> Typereturn-type-requirements の削除)(ほとんど)volatileは非推奨になりました
DR:[]コンストラクターへの影響
新しい標準ライブラリの概念では、 PascalCase(標準ライブラリの残りの部分としてのstandard_case)は使用されません。
テキストフォーマット (クロノ統合、コーナーケース修正)
ビット演算 constexpr INVOKE 数学定数
アトミックへの一貫性の追加(std::atomic_ref、 std::atomic>)
<=>演算子を標準ライブラリに追加します
標準ライブラリのヘッダーユニット
同期機能(マージ元:効率的なアトミック待機とセマフォ、ラッチとバリア、 atom_flagの改善、小型CPUでC ++を実装不能にしない)
std::source_location
constexprコンテナ(std::string、 std::vector)
std::stop_tokenと結合スレッド(std::jthread)
2019年11月の秋の会議(ベルファスト)でのNBコメント決議中に適用された変更には、次のものが含まれます。
非型テンプレートパラメータ(NTTP)のクラス型:operator==テンプレート引数の同等性の意味がから切り離されたため、ユーザー定義が許可されないという制限が削除されましたoperator==。これにより、クラス型NTTPの配列メンバーも使用できるようになります。
浮動小数点型、ポインターと参照、および共用体と共用体のようなクラス(匿名の共用体を含むクラス型)がNTTPとして許可されるようになりました。
関数の恒等写像には、末尾のrequires-clausesも含まれるようになりました(P1971)
制約のある非テンプレート関数が削除されました
自立型の実装で利用できるようになりました
std::span■ typedefは、他の標準ライブラリと一致するようにからindex_typeに変更されましたsize_type
ケルン会議の結果としての概念の名前変更に合わせて、概念特性の名前が変更されました
範囲へのいくつかの修正と追加(P1456R1:移動のみのビュー、 P1391R4 :(std::string_viewイテレーターからのコンストラクタ-文字のペア)の範囲コンストラクター、 P1394R4:の範囲コンストラクターstd::span、 P1870R1:転送範囲< T>は微妙すぎる)
の初期化std::atomicが変更され、デフォルトおよびリストの初期化で機能するようになり std::latch、std::barrier実装が新しいメンバー関数を介してサポートするスレッドの最大数を報告できるようになりました。max std::weak_equality使用さstd::strong_equalityれなくなったため削除されました
のアルゴリズムが作成されましたconstexpr
C ++ 20の新機能または変更された機能の欠落している機能テストマクロが追加されました

参考文献
^ 「標準」。isocpp.org 。
^ サッター、ハーブ(2019-10-01)。「P1000R3:C ++ ISスケジュール」(PDF)。2020-02-13を取得。
^ Dusíková、ハナ(2019-11-06)。「N4817:2020プラハ会議の招待と情報」(PDF)。2020-02-13を取得。
^ 「現在のステータス」。isocpp.org 。
^ 「C ++ 20承認済み-ハーブサッター」。isocpp.org 。
^ 「ISO / IEC14882:2020」。
^ 「なぜC ++標準は3年ごとに出荷されるのですか?」。
^ “P0592R0:C ++ 20の全体的な計画を大胆に提案する”。
^ 「P0606R0:概念は準備ができている」(PDF)。
^ 「P1141R1-制約された宣言のためのさらに別のアプローチ」。
^ 「N4720:作業ドラフト、モジュール用のC ++の拡張」(PDF)。
^ ティムシェン; リチャード・スミス。「指定された初期化の文言」。
^ ThomasKöppe。”ラムダキャプチャを許可する”。
^ 「ジェネリックラムダの使い慣れたテンプレート構文」。
^ 「初期化子を使用したステートメントの範囲ベース」。
^ 「トリップレポート:アルバカーキでのC ++標準会議、2017年11月」。ウォーリーがさがせ!。2017-11-20 。
^ 「未評価のコンテキストでのラムダの表現」(PDF)。
^ 「デフォルトの構築可能で割り当て可能なステートレスラムダ」(PDF)。
^ 「ラムダinit-captureでのパック拡張」。www.open-std.org 。
^ 「非型テンプレートパラメータとしての文字列リテラル」(PDF)。
^ ニーナランズ; DaveedVandevoorde。「タイプ名でダウン!」。
^ 「空のオブジェクトの言語サポート」。
^ 「ありそうな属性とありそうもない属性のために提案された言い回し(改訂5)」。
^ “explicit(bool)”。www.open-std.org 。
^ 「定数式での仮想関数呼び出しの許可」。www.open-std.org 。
^ “P1330R0-constexpr内のユニオンのアクティブメンバーを変更する”。
^ 「P1002R0-constexpr関数のtry-catchブロック」(PDF)。
^ 「P1327R0-定数式でdynamic_cast、ポリモーフィックtypeidを許可する」。
^ “P1006R1-std :: pointer_traitsのConstexpr” (PDF)。
^ 「P1073R2-即時機能」。
^ 「P1236R0:P0907R4符号付き整数の代替表現は2の補数です」。
^ 「P0668R4:C ++メモリモデルの改訂」。
^ “P1091R1:構造化バインディングを拡張して変数宣言のように”。www.open-std.org 。
^ “P1091R2:構造化バインディングを拡張して変数宣言のように”。www.open-std.org 。
^ 「N4649:作業ドラフト、コルーチンのC ++拡張に関する技術仕様」(PDF)。
^ “P1099R5:列挙型の使用”。www.open-std.org。2019-07-20 。
^ “P1143R2:constinitキーワードの追加”。www.open-std.org。2019-07-20 。
^ 「P0896R3」(PDF)。
^ 「配列をサポートするためのmake_sharedの拡張」。
^ メレディス、アリスデア; サッター、ハーブ。「C ++ 20のatomic_shared_ptrの改訂」。JTC1 / SC22 / WG21-C ++標準委員会-ISOCPP。ISO 。
^ 「ポインタを生のポインタに変換するユーティリティ」。
^ ハワードE.ヒナント; トマシュ・カミンスキー。「をカレンダーとタイムゾーンに拡張する」。
^ ニールマッキントッシュ; ステファン・T・ラヴァヴェイ。「スパン:オブジェクトのシーケンスの境界セーフビュー」。
^ Alisdair Meredith; ステファン・T・ラヴァヴェイ(2018-10-04)。「C ++ 20のLibraryFundamentals2から一貫したコンテナ消去を採用する」。
^ アラン・タルボット。”<バージョン>“。
^ 「ビットキャストオブジェクト表現」。www.open-std.org 。
^ 「機能テストマクロをC ++ WDに統合する」。www.open-std.org 。
^ 「P1032R1-その他のconstexprビット」。
^ 「デフォルトの初期化によるスマートポインタの作成」。
^ “std :: map :: contains–cppreference.com”。en.cppreference.com 。
^ “P0553R4:ビット演算”。www.open-std.org。2019-07-20 。
^ 「P0556R3:2の積分演算」。www.open-std.org。2018-06-06 。
^ 「P1355R2ceil2の狭い契約を公開する」。www.open-std.org。2019-06-11 。
^ 「低レベルのビット操作関数の名前について」(PDF)。www.open-std.org。2020-02-11 。
^ TomaszKamiński(2017-11-09)。「簡略化された部分機能適用」。
^ 「C ++キーワード-cppreference.com」。en.cppreference.com 。
^ 「明示的な指定子-cppreference.com」。en.cppreference.com 。
^ “P1152R4:揮発性の廃止”。www.open-std.org。2019-07-20 。
^ “属性指定子シーケンス(C ++ 11以降)-cppreference.com”。en.cppreference.com 。
^ 「ワーキングドラフト、プログラミング言語C ++の標準(付録C、§C.1)」(PDF)。
^ “P1161R2:添え字式でのコンマ演算子の使用を廃止します”。www.open-std.org 。
^ 「並列処理バージョン2のC ++拡張機能」。
^ 「タスクブロック」。
^ 「リフレクションのためのC ++拡張機能」。
^ 「ネットワーキングのためのC ++拡張」。
^ サッター、ハーブ(2019-07-20)。「トリップレポート:夏のISO C ++標準会議(ケルン)」。サッターズミル。
^ 「リフレクション提案に関するリフレクション-C ++会議」。Meetingcpp.com 。
^ 「静的反射」。www.open-std.org 。
^ ハーブサッター。「メタクラス」(PDF)。
^ 「C ++のための統一されたエグゼキュータの提案」。www.open-std.org 。
^ 「N4771:ワーキングドラフト、ネットワーキング用のC ++拡張機能」(PDF)。
^ 「ISO / IECTS 19216:2018プログラミング言語-ネットワーク用のC ++拡張機能」。
^ 「一般的なプロパティのカスタマイズメカニズム」。www.open-std.org 。
^ 「C ++のための統一された先物の提案」。
^ https://clang.llvm.org/cxx_status.html ^ https://en.cppreference.com/w/cpp/compiler_support ^ https://gcc.gnu.org/legacy-ml/gcc-patches/2017-07/msg01234.html ^ https://gcc.gnu.org/projects/cxx-status.html ^ jawiddis。「VisualStudio2019バージョン16.10リリースノート」。docs.microsoft.com 。
^ 「MSVCC ++ 20および/ std:c ++ 20スイッチ」。docs.microsoft.com 。2021-09-07を取得。
^ https://github.com/MicrosoftDocs/cpp-docs/blob/master/docs/overview/cpp-conformance-improvements.md ^ ハーブサッター。「トリップレポート:夏のISO C ++標準会議(トロント)」。
^ アンドリュー・サットン; ビャーネ・ストロヴルプ(2013-02-24)。「ConceptsLite:述語によるテンプレートの制約」。isocpp.org。isocpp.org 。
^ ハーブサッター。「トリップレポート:秋のISO C ++標準会議(アルバカーキ)」。
^ スミス、リチャード; Perchik、夜明け; Köppe、Thomas。「N4714編集者レポート-プログラミング言語-C ++」。C ++標準ドラフト。GitHub 。
^ ボトンバロ。「トリップレポート:ジャクソンビルでのC ++標準会議、2018年3月」。
^ ハーブサッター。「トリップレポート:夏のISO C ++標準会議(ラッパースウィル)」。
^ 「C ++でのコントラクトベースのプログラミングのサポート」。www.open-std.org 。
^ 「P1289R0-契約条件でのアクセス制御」(PDF)。
^ “r / cpp-2019-02 Kona ISO C ++委員会トリップレポート(C ++ 20設計が完了、C ++ 20のモジュール、C ++ 20のコルーチン、Reflection TS v1が公開、C ++エコシステムテクニカルで作業が開始レポート)」。reddit 。
^ 「トリップレポート:冬のISO C ++標準会議(コナ)」。サッターズミル。2019-02-23 。
^ “r / cpp-2019-07ケルンISOC ++委員会旅行レポート— C ++ 20イーグルが上陸しました (C ++ 20委員会ドラフトが出荷されました;契約はC ++ 20から研究グループに移動しました; ‘std: :format’in C ++ 20; C ++ 20同期ライブラリ) “。reddit 。
^ ボトンバロ。「トリップレポート:ケルンでのC ++標準会議、2019年7月」。
^ サッター、ハーブ。「トリップレポート:夏のISO C ++標準会議(ケルン)」。
^ Josuttis、ニコライ。「P1823R0:C ++ 20から契約を削除する」(PDF)。
^ 「constexprコンテキストでの些細なデフォルト初期化の許可」(PDF)。
^ 「P1668R1:Constexpr関数で未評価のインラインasmを許可することによりConstexpr組み込み関数を有効にする」。www.open-std.org 。
^ 「P1186R3:実際に<=>を使用するのはいつですか?」。www.open-std.org。2019-07-20 。
^ 「P1630R1:宇宙船は調整が必要です」。www.open-std.org。2019-07-20 。
^ 「P1766R1:マイナーモジュールの病気を軽減する」。www.open-std.org。2019-07-20 。
^ 「P1452R2:return-type-requirementsの不均一なセマンティクスについて」。www.open-std.org。2019-07-20 。
^ 「P1771R1:コンストラクターのnodiscard」(PDF)。www.open-std.org。2019-07-20 。
^ 「P1754R1:コンセプトの名前をC ++ 20のstandard_caseに変更しますが、まだ可能です」(PDF)。www.open-std.org。2019-07-20 。
^ 「P0645R10:テキストフォーマット」。www.open-std.org。2019-07-20 。
^ “std :: format in C ++ 20″。www.zverovich.net。2019-07-23 。
^ 「P1361R2:クロノとテキストフォーマットの統合」(PDF)。www.open-std.org。2019-07-20 。
^ “P1652R1:std :: formatのPrintfコーナーケース”。www.open-std.org。2019-07-20 。
^ 「P1965R2:constexprINVOKE」。www.open-std.org。2019-07-20 。
^ 「P0631R8:数学定数」(PDF)。www.open-std.org。2019-07-20 。
^ “P1643R1:待機/通知をatomic_ref に追加”。www.open-std.org。2019-07-20 。
^ “P1664R0:待機/通知をatomic >に追加します”。www.open-std.org。2019-07-20 。
^ 「P1614R2:母性が上陸しました-ライブラリに<=>を追加します」。www.open-std.org。2019-07-20 。
^ 「P1502R1:C ++ 20用の標準ライブラリヘッダーユニット」。www.open-std.org。2019-07-20 。
^ 「P1135R6:C ++ 20同期ライブラリ」。www.open-std.org。2019-07-20 。
^ 「P0514R4:C ++ 20の効率的な同時待機」(PDF)。
^ 「P0666R2:C ++ 20のラッチとバリアの改訂」(PDF)。
^ 「P0995R1:atomic_flagの改善」。
^ 「P1285R0:小さいCPUでC ++を実装不能にしないでください」。
^ 「P1208R6:C ++ 20用のLibraryFundamentals V3からsource_locationを採用する」(PDF)。
^ 「P0980R1:std :: string constexprの作成」(PDF)。
^ 「P1004R2:std :: vector constexprの作成」(PDF)。
^ 「P0660R10:トークンの停止とスレッドへの参加」(PDF)。
^ “r / cpp-2019-11 Belfast ISO C ++委員会トリップレポート— C ++ 20委員会ドラフトに関するフィードバックの処理を開始; ABIレビューグループが結成されました”。reddit 。2019-11-09を取得。
^ サッター、ハーブ(2019-11-09)。「トリップレポート:秋のISO C ++標準会議(ベルファスト)」。サッターズミル。2019-11-09を取得。
^ botondballo(2019-11-15)。「トリップレポート:ベルファストでのC ++標準会議、2019年11月」。ウォーリーがさがせ!。
^ 「P1907R0:非型テンプレートパラメータとの不一致」。www.open-std.org。2019-10-07 。2019-11-09を取得。
^ 「P1714:NTTPは、float、double、およびlong doubleなしでは不完全です!(リビジョン1)」。www.open-std.org。2019-07-19 。2019-11-09を取得。
^ “P1855R =:を自立させる”。www.open-std.org。2019-10-05 。2019-11-09を取得。
^ 「P1872R0:スパンにはindex_typeではなくsize_typeが必要です」(PDF)。www.open-std.org。2019-09-16 。2019-11-09を取得。
^ 「P1456:移動のみのビュー」(PDF)。www.open-std.org。2019-01-25 。2019-11-09を取得。
^ 「P1391:std :: string_viewの範囲コンストラクター」(PDF)。www.open-std.org 。2019-11-09を取得。
^ 「P1394:std :: spanの範囲コンストラクター」(PDF)。www.open-std.org。2019-08-02 。2019-11-09を取得。
^ 「P1870R1:転送範囲が微妙すぎる」。www.open-std.org 。2019-11-09を取得。
^ 「P0883:原子の初期化の修正」(PDF)。www.open-std.org。2018-06-05 。2019-11-09を取得。
^ 「機能テストマクロ2018-2019がありません」。www.open-std.org。2019-10-06 。2019-11-09を取得。

外部リンク
ISOオンラインストアからISO / IEC 14882:2020を購入するためのリンク。
N4860、標準の最終ドラフトバージョン。
JTC1 / SC22 / WG21  – ISO / IEC C ++標準ワーキンググループ(別名C ++標準委員会)
Ranges(range-v3)GitHubリポジトリ、EricNieblerによる