C++20
提供: cppreference.com
< cpp
C++ 標準の次のメジャーな改訂です。
This section is incomplete |
目次 |
[編集]新しい言語機能
- 機能テストマクロ
- 三方比較演算子 <=> および operator==()=default
- 指示付き初期化子
- 範囲
for
における初期化文および初期化子 - char8_t
[[no_unique_address]]
[[likely]]
[[unlikely]]
- ラムダキャプチャにおけるパック展開
- 多くの文脈において型の曖昧性を解消するための
typename
の使用の要件を削除 - consteval、 constinit
- さらなる constexpr の緩和
- 符号付き整数は2の補数である
- 丸括弧を用いた集成体初期化
- コルーチン
- モジュール
- 制約とコンセプト
- 省略形の関数テンプレート
- DR: 配列 new は配列のサイズを推定できる
[編集]新しいライブラリ機能
[編集]新しいヘッダ
- <concepts>
- <coroutine>
- <compare>
- <version>
- <source_location>
- <format>
- <span>
- <ranges>
- <bit>
- <numbers>
- <syncstream>
[編集]ライブラリ機能
- 書式化ライブラリ
- カレンダーとタイムゾーンライブラリ
- std::source_location
- std::span
- std::endian
- std::make_shared の配列サポート
- std::remove_cvref
- std::to_address
- 浮動小数点および shared_ptr のアトミック型
- std::barrier、 std::latch、および std::counting_semaphore
- std::jthread およびスレッドキャンセル関係のクラス
<version>
- std::osyncstream
- std::u8string およびその他の char8_t の用途
<algorithm>
、<utility>
、<complex>
に対する constexprstd::string(_view)::starts_with
およびends_with
- std::assume_aligned
- std::bind_front
- std::c8rtomb/std::mbrtoc8
- std::make_obj_using_allocator など
- std::make_shared_for_overwrite/std::make_unique_for_overwrite
- 非連想コンテナにおける型混合検索
- std::polymoprhic_allocator の追加メンバ関数およびデフォルトテンプレート引数としての std::byte
- std::execution::unseq
- std::midpoint および std::lerp
- std::ssize
- std::is_bounded_array
- 範囲
- 統一コンテナ削除 (
std::erase
/std::erase_if
) - 数学定数
[編集] 欠陥報告
[編集]コンパイラのサポート状況
主記事: C++ コンパイラのサポート状況
[編集] C++20 のコア言語の機能
C++20 の機能 | 文書 | GCC | Clang | MSVC | Apple Clang | EDG eccp | Intel C++ | IBM XLC++ | Sun/Oracle C++ | Embarcadero C++ Builder | Cray | Portland Group (PGI) | Nvidia nvcc | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ラムダキャプチャ [=, this] を許容する | P0409R2 | 8 | 6 | 19.22* | 10.0.0* | 5.1 | ||||||||
__VA_OPT__ | P0306R4 P1042R1 | 8 (partial)* 10 (partial)* | 9 | 19.25* | 11.0.3* | 5.1 | ||||||||
指示付き初期化子 | P0329R4 | 4.7 (partial)* 8 | 3.0 (partial)* 10 | 19.21* | (partial)* | 5.1 | ||||||||
総称ラムダに対するテンプレート引数リスト | P0428R2 | 8 | 9 | 19.22* | 11.0.0* | 5.1 | ||||||||
ビットフィールドに対するデフォルトメンバ初期化子 | P0683R1 | 8 | 6 | 19.25* | 10.0.0* | 5.1 | ||||||||
クラステンプレートの実引数推定における初期化子リストコンストラクタ | P0702R1 | 8 | 6 | 19.14* | Yes | 5.0 | ||||||||
const& 修飾されたメンバポインタ | P0704R1 | 8 | 6 | 19.0* | 10.0.0* | 5.1 | ||||||||
コンセプト | P0734R0 | 6 (TS only) 10 | 10 | 19.23*(partial)* | 6.1 | |||||||||
非評価文脈におけるラムダ | P0315R4 | 9 | ||||||||||||
三方比較演算子 | P0515R3 | 10 | 8 (partial) 10 | 19.20* | 5.1 | |||||||||
DR: 暗黙のラムダキャプチャの単純化 | P0588R1 | 8 | 19.24* | 5.1 | ||||||||||
範囲ベースの for に対する初期化文 | P0614R1 | 9 | 8 | 19.25* | 11.0.0* | 6.0 | ||||||||
デフォルト構築可能かつ代入可能なステートレスラムダ | P0624R2 | 9 | 8 | 19.22* | 10.0.1* | 5.1 | ||||||||
デフォルト化されたコピーコンストラクタの const のミスマッチ | P0641R2 | 9 | 8 | 19.21* (partial) | 10.0.1* | 5.1 | ||||||||
特殊化におけるアクセスチェック | P0692R1 | Yes | 8 (partial) | 19.26* | 10.0.1* (partial) | 5.1 | ||||||||
ADL と可視でない関数テンプレート | P0846R0 | 9 | 9 | 19.21* | 11.0.3* | 5.1 | ||||||||
constexpr 関数の実体化の遅延 | P0859R0 | 5.2 (partial)* 9 | ||||||||||||
[[likely]] 属性と [[unlikely]] 属性 | P0479R5 | 9 | 19.26* | 5.1 | ||||||||||
typename をよりオプショナルにする | P0634R3 | 9 | 5.1 | |||||||||||
ラムダ式の初期化キャプチャにおけるパック展開 | P0780R2 | 9 | 9 | 19.22* | 11.0.3* | 6.1 | ||||||||
[[no_unique_address]] 属性 | P0840R2 | 9 | 9 | 11.0.3* | 5.1 | |||||||||
DR: 構造化束縛のカスタマイゼーションポイント探索ルールの緩和 | P0961R1 | 8 | 8 | 19.21* | 10.0.1* | 5.1 | ||||||||
DR: 範囲 for ループのカスタマイゼーションポイント探索ルールの緩和 | P0962R1 | 8 | 5.1 | |||||||||||
DR: アクセス可能なメンバへの構造化束縛を可能にする | P0969R0 | 8 | 8 | 19.21* | 10.0.1* | 5.1 | ||||||||
破棄削除演算子 | P0722R3 | 9 | 6 | 19.27* | 10.0.0* | 6.1 | ||||||||
非型テンプレート引数におけるクラス型 | P0732R2 | 9 | 19.26* | |||||||||||
[=] による this の暗黙のキャプチャを非推奨にする | P0806R2 | 9 | 19.22* | 5.1 | ||||||||||
explicit(bool) | P0892R2 | 9 | 9 | 19.24* | 11.0.3* | 5.1 | ||||||||
機能テストマクロの統合 | P0941R2 | 5 | 3.4 | 19.15* (partial) 19.20* | Yes | 5.0 | ||||||||
ユーザ宣言されたコンストラクタを持つ集成体の禁止 | P1008R1 | 9 | 8 | 19.20* | 10.0.1* | 5.1 | ||||||||
constexpr 仮想関数 | P1064R0 | 9 | 9 | 11.0.3* | 5.1 | |||||||||
比較に対する一貫性の改善 | P1120R0 | 10 | 8 (partial) 10 | 19.22* | 10.0.1* (partial) | 5.1 | ||||||||
char8_t | P0482R6 | 9 | 7 | 19.22* | 10.0.0* | 5.1 | ||||||||
std::is_constant_evaluated() | P0595R2 | 9 | 9 | 19.25* | 11.0.3* | 5.1 | 19.1 | |||||||
constexpr try -catch ブロック | P1002R1 | 9 | 8 | 19.25* | 10.0.1* | 5.1 | ||||||||
即時関数 | P1073R3 | 10 (partial)* 11 | 5.1 | |||||||||||
ネストしたインライン名前空間 | P1094R2 | 9 | 8 | 10.0.1* | 5.1 | |||||||||
制約付き宣言のためのもうひとつの方法 | P1141R2 | 10 | 19.26* (partial) | 6.1 | ||||||||||
符号付き整数は2の補数である | P1236R1 | 9 | 9 | 11.0.3* | N/A | |||||||||
constexpr dynamic_cast および多相 typeid | P1327R1 | 10 | 9 | 11.0.3* | 5.1 | |||||||||
constexpr での共用体のアクティブメンバの変更 | P1330R0 | 9 | 9 | 19.10* | 11.0.3* | 5.1 | ||||||||
コルーチン | P0912R5 | 10 | 8 (partial) | 19.25* 19.28* (partial*) | 10.0.1* (partial) | 5.1 | ||||||||
集成体の丸括弧初期化 | P0960R3 | 10 | 5.1 | |||||||||||
DR: new 式における配列サイズの推定 | P1009R2 | 9 | 11.0.3* | 5.1 | ||||||||||
モジュール | P1103R3 | 8 (partial) | 19.25* (partial) | 10.0.1* (partial) | ||||||||||
より強い Unicode の要件 | P1041R4 P1139R2 | 10 | Yes | 19.0* (P1041R4) 19.26* (P1139R2) | Yes | N/A | ||||||||
<=> != == | P1185R2 | 10 | 10 | 19.22* | 5.1 | |||||||||
DR: 異なる例外指定を用いて明示的にデフォルト化された関数 | P1286R2 | 10 | 9 | 11.0.3* | 5.1 | |||||||||
構造化束縛のラムダキャプチャと記憶域クラス指定子 | P1091R3 P1381R1 | 10 | 8 (partial) | 10.0.1* (partial) | 5.1 | |||||||||
境界が未知な配列への変換を許可する | P0388R4 | 10 | 6.0 | |||||||||||
constexpr なコンテナ操作 | P0784R7 | 10 | 10 | 6.0 | ||||||||||
一部の volatile の使用方法を非推奨にする | P1152R4 | 10 | 10 | 6.0 | ||||||||||
constinit | P1143R2 | 10 | 10 | 6.1 | ||||||||||
添字内のコンマ演算子を非推奨にする | P1161R3 | 10 | 9 | 19.25* | 11.0.3* | 6.0 | ||||||||
メッセージ付きの [[nodiscard]] | P1301R4 | 10 | 9 | 19.25* | 11.0.3* | 6.0 | ||||||||
constexpr 関数内のトリビアルなデフォルト初期化 | P1331R2 | 10 | 10 | 6.1 | ||||||||||
constexpr 関数内の評価されない asm 宣言 | P1668R1 | 10 | 10 | 6.1 | ||||||||||
using enum | P1099R5 | 19.24* | ||||||||||||
指定された比較カテゴリに対する三方比較の合成 | P1186R3 | 10 | 10 | 19.24* | 6.0 | |||||||||
DR: コンストラクタに対する [[nodiscard]] | P1771R1 | 10 | 9 | 19.24* | 11.0.3* | 6.0 | ||||||||
エイリアステンプレートに対するクラステンプレートの実引数推定 | P1814R0 | 10 | ||||||||||||
集成体に対するクラステンプレートの実引数推定 | P1816R0 P2082R1 | 10(P1816R0) 11(P2082R1) | ||||||||||||
DR: より多くのローカルオブジェクトおよび右辺値参照に対する暗黙のムーブ | P1825R0 | 19.24* | 6.0 | |||||||||||
値によるデフォルト比較を可能にする | P1946R0 | 10 | 19.25* | 6.1 | ||||||||||
std::weak_equality および std::strong_equality の削除 | P1959R0 | 10 | 19.25* | 6.1 | ||||||||||
非型テンプレート引数の非一貫性 | P1907R1 | 9 | 19.26* | |||||||||||
DR: 擬似デストラクタによるオブジェクトの生存期間の終了 | P0593R6 | 11 | N/A | |||||||||||
DR: T* から bool への変換は縮小変換とみなされるべき | P1957R2 | 10* 11* | 6.1 | |||||||||||
C++20 の機能 | 文書 | GCC | Clang | MSVC | Apple Clang | EDG eccp | Intel C++ | IBM XLC++ | Sun/Oracle C++ | Embarcadero C++ Builder | Cray | Portland Group (PGI) | Nvidia nvcc |
[編集] C++20 のライブラリの機能
C++20 の機能 | 文書 | GCC libstdc++ | Clang libc++ | MSVC の 標準ライブラリ | Apple Clang | Sun/Oracle C++ の 標準ライブラリ | Embarcadero C++ Builder の 標準ライブラリ | Cray C++ の 標準ライブラリ | |
---|---|---|---|---|---|---|---|---|---|
std::endian | P0463R1 | 8 | 7 | 19.22* | 10.0.0* | ||||
配列をサポートするための std::make_shared() の拡張 | P0674R1 | 19.27* | |||||||
浮動小数点アトミック型 | P0020R6 | 10 | 19.22* | ||||||
同期されたバッファ付きの ostream | P0053R7 | ||||||||
<algorithm> および <utility> に対する constexpr | P0202R3 | 10 | 8 (partial) | 19.26* | 10.0.1* (partial) | ||||
<complex> に対するさらなる constexpr | P0415R1 | 9 | 7 (partial) | 19.27* | 10.0.0* (partial) | ||||
std::memory_order をスコープ付き列挙にする | P0439R0 | 9 | 9 | 19.25* | 11.0.3* | ||||
文字列の接頭辞と接尾辞のチェック | P0457R2 | 9 | 6 | 19.21* | 10.0.0* | ||||
operator<=> に対するライブラリサポート (<compare>) | P0768R1 | 10 | 7 (partial) | 19.20* (partial) | 10.0.0* (partial) | ||||
std::remove_cvref | P0550R2 | 9 | 6 | 19.20* | 10.0.0* | ||||
標準ライブラリにおける [[nodiscard]] | P0600R1 | 9 | 7 (partial) | 19.13* (partial) 19.22* | 10.0.0* (partial) | ||||
数値演算アルゴリズムで std::move を使用する | P0616R0 | 9 | 19.23* | ||||||
ポインタを生のポインタに変換するユーティリティ | P0653R2 | 8 | 6 | 19.22* | Yes | ||||
アトミックな std::shared_ptr および std::weak_ptr | P0718R2 | 19.27* | |||||||
std::span | P0122R7 | 10 | 7 | 19.26* | 10.0.0* | ||||
カレンダーとタイムゾーン | P0355R7 | 7 (partial) | 10.0.0* (partial) | ||||||
<version> | P0754R2 | 9 | 7 | 19.22* | 10.0.0* | ||||
非順序コンテナの比較 | P0809R0 | 16.0* | |||||||
ConstexprIterator 要件 | P0858R0 | 9 | 19.11* | ||||||
std::basic_string::reserve() は縮小するべきでない | P0966R1 | 8 | 19.25* | 10.0.1* | |||||
std::atomic_ref | P0019R8 | 10 | |||||||
連想コンテナの contains() メンバ関数 | P0458R2 | 9 | 19.21* | ||||||
DR: 区分的構築に対するコピー省略の保証 | P0475R1 | 9 | |||||||
std::bit_cast() | P0476R2 | 19.27* | |||||||
2の整数乗演算 | P0556R3P1956R1 | 9 (P0556R3) 10 (P1956R1) | 19.25* (P0556R3)* 19.27* (P1956R1)* 19.28* | ||||||
erase ライクなアルゴリズムの戻り値の改善 | P0646R1 | 9 | 10 | 19.21* | |||||
std::destroying_delete | P0722R3 | 9 | 9 | 19.27* | 11.0.3* | ||||
std::is_nothrow_convertible | P0758R1 | 9 | 9 | 19.23* | 11.0.3* | ||||
<algorithm> に shift を追加する | P0769R2 | 10 | 19.21* | ||||||
std::swap() および swap 関連関数に対する constexpr | P0879R0 | 10 | 19.26* | ||||||
std::type_identity | P0887R1 | 9 | 8 | 19.21* | 10.0.1* | ||||
コンセプトライブラリ | P0898R3 | 10 | 19.23* | ||||||
std::array に対する constexpr 比較演算子 | P1023R0 | 10 | 8 | 19.27* | 10.0.1* | ||||
std::unwrap_ref_decay および std::unwrap_reference | P0318R1 | 9 | 8 | 19.21* | 10.0.1* | ||||
std::bind_front() | P0356R5 | 9 | 19.25* | ||||||
不完全型に対する std::reference_wrapper | P0357R3 | 9 | 8 | 19.26* | 10.0.1* | ||||
operator>>(basic_istream&, CharT*) の修正 | P0487R1 | 8 | 19.23* | 10.0.1* | |||||
char8_t のためのライブラリサポート | P0482R6 | 9 | 19.22* | ||||||
アロケータ使用構築を実装するためのユーティリティ関数 | P0591R4 | 9 | |||||||
DR: std::variant および std::optional はコピー/ムーブのトリビアル性を伝播するべき | P0602R4 | 8.3 | 8 | 19.11* | 10.0.1* | ||||
まともな std::variant の変換コンストラクタ | P0608R3 | 10 | 9 | 11.0.3* | |||||
std::function のムーブコンストラクタは noexcept であるべき | P0771R1 | 7.2 | 6 | 19.22* | Yes | ||||
ひとつの範囲の提案 | P0896R4 | 10 | |||||||
非順序コンテナに対する型混合検索 | P0919R3P1690R1 | 19.23* (P0919R3) 19.25* (P1690R1) | |||||||
<chrono> の zero() 、 min() 、および max() は noexcept であるべき | P0972R0 | 9 | 8 | 19.14* | 10.0.1* | ||||
std::pointer_traits の constexpr | P1006R1 | 9 | 8 | 19.26* | 10.0.1* | ||||
std::assume_aligned() | P1007R3 | 9 | |||||||
雑多な constexpr の寄せ集め | P1032R1 | 10 | 19.28* | ||||||
std::span の比較演算子を削除する | P1085R2 | 10 | 8 | 19.26* | 10.0.1* | ||||
operator+(basic_string) のステートフルなアロケータの伝播の一貫性の向上 | P1165R1 | 10 | 19.26* | ||||||
一貫性のあるコンテナ削除 | P1209R0P1115R3 | 9 (P1209R0) 10 (P1115R3) | 8 (P1209R0) 11 (P1115R3) | 19.25* (P1209R0) 19.27* (P1115R3) | 10.0.1* (P1209R0) | ||||
std::lerp() および std::midpoint() | P0811R3 | 9 | 9 | 19.23* (partial) | 11.0.3* | ||||
std::span の利便性の改善 | P1024R3 | 10 | 9 | 19.26* | 11.0.3* | ||||
DR: create_directory() を直感的にする | P1164R1 | 8.3 | 19.20* | ||||||
std::ssize() と std::span の符号なしエクステント | P1227R2 | 10 | 9 | 19.25* | 11.0.3* | ||||
境界が未知な配列と境界が既知な配列のための型特性 | P1357R1 | 9 | 9 | 19.25* | 11.0.3* | ||||
std::to_array() | P0325R4 | 10 | 10 | 19.25* | |||||
std::basic_stringbuf のバッファへの効率的なアクセス | P0408R7 | ||||||||
レイアウト互換性およびポインタ相互変換可能性の型特性 | P0466R5 | ||||||||
ビット操作 | P0553R4 | 9 | 9 | 19.25** 19.28* | 11.0.3* | ||||
数学定数 | P0631R8 | 10 | 11 | 19.25* | |||||
テキストの書式化 | P0645R10 | ||||||||
std::stop_token と std::jthread | P0660R10 | 10 | |||||||
constexpr std::allocator および関連ユーティリティ | P0784R7 | 10 | |||||||
constexpr std::string | P0980R1 | ||||||||
constexpr std::vector | P1004R2 | ||||||||
入力範囲アダプタ | P1035R7 | 10 | |||||||
constexpr std::invoke() および関連ユーティリティ | P1065R2 | 10 | 19.28* | ||||||
アトミックな待機および通知、 std::counting_semaphore、 std::latch および std::barrier | P1135R6 | ||||||||
std::source_location | P1208R6 | 7 (TS only) | |||||||
<=> を標準ライブラリに追加する | P1614R2 | 10 | |||||||
std::atomic および std::atomic_flag の constexpr デフォルトコンストラクタ | P0883R2 | 19.26* | |||||||
数値演算アルゴリズムに対する constexpr | P1645R1 | 10 | 19.26* | ||||||
安全な整数型の比較 | P0586R2 | 10 | 19.27* | ||||||
C++20 の機能 | 文書 | GCC libstdc++ | Clang libc++ | MSVC の 標準ライブラリ | Apple Clang | Sun/Oracle C++ の 標準ライブラリ | Embarcadero C++ Builder の 標準ライブラリ | Cray C++ の 標準ライブラリ |
* - 注釈を見るにはバージョン番号にマウスポインタを当ててください