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>
に対する constexpr -
std::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の整数乗演算 | P0556R3 P1956R1 | 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 | |||||||
非順序コンテナに対する型混合検索 | P0919R3 P1690R1 | 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* | ||||||
一貫性のあるコンテナ削除 | P1209R0 P1115R3 | 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++ の 標準ライブラリ |
* - 注釈を見るにはバージョン番号にマウスポインタを当ててください