C++20とは、2020年中に改訂される予定の、C++バージョンの通称である。
このバージョンは、策定中はC++2aと呼ばれることがあった。「202a年にリリースされる」という伏せ字として「a」が使われているが、3年周期に次のバージョンが策定されることが決まっているため、伏せ字になっている年数がずれることはない。
言語機能 | 説明 |
---|---|
一貫比較 | 三方比較演算子によって比較演算子の自動生成を行うようにする |
ビットフィールドのメンバ変数初期化 | ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する |
関数を条件付きでexplicit にする構文を追加 |
explicit(true) のようにexplicit に真理値パラメータを指定できるようにする |
const 修飾されたメンバポインタの制限を修正 |
.* 演算子での左辺値のconst メンバ関数呼び出しを許可する |
デフォルトのコピーコンストラクタと非const なコンストラクタが衝突する問題を修正 |
|
特殊化のアクセスチェック | |
空オブジェクトを言語サポート | [[no_unique_address]] 属性を導入し、空の型のオブジェクトをほかのオブジェクトと共有する最適化を許可する |
friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 | 構造化束縛の仕様として公開メンバ変数のみを取り出せるようになっていたが、friend指定された関数からは非公開メンバ変数にもアクセスできるようにする |
構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和 | 非テンプレートのget() メンバ関数が見つかった場合は、非メンバ関数のget() を探しにいく |
抽象型のチェック | 関数の宣言段階では、パラメータおよび戻り値型が抽象型かどうかをチェックしないようにする |
可変長データを扱うクラスの効率的なdelete |
クラスのdelete 演算子が呼び出される前にデストラクタが呼ばれないようにするオプションを追加 |
特殊メンバ関数の条件付き自明定義 | 制約によって自明な特殊メンバ関数と非自明な特殊メンバ関数をオーバーロードできるようにする |
言語機能 | 説明 |
---|---|
スコープ付き列挙型のusing宣言 | using enum EnumType; もしくはusing EnumType::enumerator とすることで、列挙値のスコープ指定を省略できるようにする |
言語機能 | 説明 |
---|---|
指示付き初期化 | |
構造化束縛を拡張して通常の変数宣言のように使用できるようにする | 記憶域指定子としてstatic とthread_local の指定を許可 |
丸カッコの値リストからの集成体初期化を許可 | T x{1, 2, 3}; と同様にT x(1, 2, 3); でも集成体初期化できるようにする |
new 式での配列要素数の推論 |
double* p = new double[]{1,2,3}; を許可 |
要素数不明の配列への変換を許可 | 要素数が判明している配列から、要素数が不明の配列への変換を許可 |
ほとんどのvolatile を非推奨化 |
volatile の有用な機能のみを残し、効果が疑わしい、または壊れている機能を非推奨化する |
言語機能 | 説明 |
---|---|
符号付き整数型が2の補数表現であることを規定 | 符号付き整数型のビット表現を2の補数に規定する |
言語機能 | 説明 |
---|---|
UTF-8エンコーディングされた文字の型としてchar8_t を追加 |
UTF-8エンコードされた文字かどうかでオーバーロード・特殊化をできるようにする |
char16_t とchar32_t の文字・文字列リテラルを、文字コードUTF-16/32に規定 |
__STDC_UTF_16__ 、__STDC_UTF_32__ の定義に関係なく、char16_t 、char32_t のリテラルをUTF-16/32文字コードに規定する |
言語機能 | 説明 |
---|---|
[[nodiscard]] 属性に理由となる文字列を付加できるようにする |
関数の戻り値を無視してはならない理由を関数宣言に持たせ、警告メッセージに役立てる |
言語機能 | 説明 |
---|---|
初期化式をともなう範囲for文 | 範囲for文スコープで使用する変数の初期化のための構文を追加 |
範囲for文がカスタマイゼーションポイントを見つけるルールを緩和 | begin() /end() メンバ関数のどちらかが見つからなかった場合に非メンバ関数のbegin() /end() を探しにいく |
当たる確率が高い分岐と、当たる確率が低い分岐をコンパイラに伝える属性を追加 | コンパイラが分岐予測するためのヒントとする |
言語機能 | 説明 |
---|---|
コンセプト | テンプレートパラメータに対する制約を行う |
autoパラメータによる関数テンプレートの簡易定義 | ジェネリックラムダと同様、関数パラメータをの型をauto にすることで簡易的に関数テンプレートを定義できるようにする |
型の文脈でtypename の省略を許可 |
型しか現れない文脈では、依存名を解決するためのtypename キーワードを省略できるようにする |
非型テンプレートパラメータとしてクラス型を許可する | std::strong_equality に変換可能な非メンバ関数<=> をもつ型を、非型テンプレートパラメータとして使用できるようにする |
関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正 | |
集成体クラステンプレートのテンプレート引数推論 | クラステンプレートのテンプレート引数推論はコンストラクタ引数から推論されるが、集成体初期化からも推論できるようにする |
エイリアステンプレートに対するクラステンプレートのテンプレート引数推論 | エイリアステンプレートからクラステンプレートのテンプレート引数を推論できるようにする |
言語機能 | 説明 |
---|---|
評価されない文脈でconstexpr 関数が定数式評価されることを規定 |
|
定数式からの仮想関数の呼び出しを許可 | 仮想関数にconstexpr を付けられない制限を解除 |
定数式でのdynamic_cast 、多態的なtypeid を許可 |
定数式での動的多態を許可 |
constexpr関数内でのtry-catchブロックを許可 | constexpr関数内での例外の捕捉を許可する |
即時関数 | consteval キーワードを追加し、常に定数式評価されるよう指定できるようにする |
定数式内での共用体のアクティブメンバの変更を許可 | 共用体メンバの書き換えを定数式内で行えるようにする |
constexprの文脈での自明なデフォルト初期化を許可 | constexpr関数内でのデフォルト初期化を許可し、未初期化値を読むことのみ禁止する |
constexpr関数内で未評価のインラインアセンブリを許可することによる組み込み関数のconstexpr有効化 | コンパイル時に評価されない場合にconstexpr関数にasm定義を含めることを許可 |
コンパイル時初期化を強制するconstinit キーワードを追加 |
初期化のみコンパイル時におわらせたい場合に使用する |
可変サイズをもつコンテナのconstexpr 化 |
constexpr 記憶域をもつメモリアロケータの存在を考慮することで、可変サイズをもつコンテナをコンパイル時に使用できるようにする |
言語機能 | 説明 |
---|---|
ジェネリックラムダのテンプレート構文 | ジェネリックラムダでテンプレートパラメータを定義できるようにする |
ラムダ式のキャプチャとして[=, this] を許可する |
デフォルトコピーキャプチャとthis ポインタのコピーキャプチャを両方指定できるようにする |
[=] によるthis の暗黙のキャプチャを非推奨化 |
コピーのデフォルトキャプチャでは、this ポインタをキャプチャされなくする |
ラムダ式の制約 | |
暗黙のラムダキャプチャを簡略化 | |
状態を持たないラムダ式を、デフォルト構築可能、代入可能とする | |
評価されない文脈でのラムダ式 | |
ラムダ式の初期化キャプチャでのパック展開を許可 | [...args = std::move(args)] のようなキャプチャを許可 |
構造化束縛したビットフィールドの参照キャプチャ | ビットフィールドを含む構造化束縛をした場合にラムダ式で参照キャプチャできない規定を緩和し、ビットフィールドを直接参照キャプチャ、もしくはデフォルト参照キャプチャして使用しなければ適格とする |
言語機能 | 説明 |
---|---|
入れ子名前空間定義でのインライン名前空間 | namespace ns1::inline ns2::ns3 {} のように、入れ子名前空間を定義する式にインライン名前空間の指定を含められるようにする |
言語機能 | 説明 |
---|---|
モジュール | ヘッダファイル・ソースファイル、インクルードに変わる仕組みとしてモジュールを導入する |
言語機能 | 説明 |
---|---|
コルーチン | 関数実行を中断・再開する仕組みとしてコルーチンを導入する |
言語機能 | 説明 |
---|---|
可変引数が空でない場合のトークン置換 | プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処 |
言語機能 | 説明 |
---|---|
PODを非推奨化 | |
[=] によるthis の暗黙のキャプチャを非推奨化 |
コピーのデフォルトキャプチャでは、this ポインタをキャプチャされなくする |
添字演算子内でのカンマ演算子の使用を非推奨化 | ar[i, j] を非推奨化。ar[(i, j)] はOK |
言語機能 | 説明 |
---|---|
throw() による例外送出しない指定を削除 |
代わりにnoexcept を使用すること |
ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止 | コンストラクタがdelete 宣言されているクラスを、集成体初期化によってコンストラクタ呼び出しを回避して構築できてしまっていた技法を禁止 |
言語機能 | 説明 |
---|---|
Unicode標準への参照を更新 | 標準C++からISO/IEC 10646への参照を更新し、古い固定バージョンへの参照をやめる |
- バージョン情報ライブラリとして
<version>
を追加。ここでは、実装依存の情報 (バージョンやリリース日付など) が標準ライブラリの実装によって定義される <chrono>
ライブラリに、カレンダーとタイムゾーンの機能を拡張- 任意のシーケンスの部分シーケンスを参照するライブラリとして
<span>
を追加 - 文字列フォーマットライブラリとして
<format>
を追加 - 出力ストリームを同期するライブラリとして
<syncstream>
を追加 - 三方比較ライブラリとして
<compare>
を追加 - 数値ライブラリとして
<numbers>
を追加。数学定数が定義される - ビット操作ライブラリとして
<bit>
を追加- Strict Aliasing規則に抵触しないビットレベルの再解釈キャストである
std::bit_cast()
関数を追加 - 2の乗数関係の関数として、整数値が2の累乗かを判定する
std::ispow2()
関数、整数値を2の累乗値に切り上げるstd::ceil2()
関数、整数値を2の累乗値に切り下げるstd::floor2()
関数、2を底とした整数値の対数を求めて1を足すstd::log2p1()
関数を追加 - 循環ビットシフトを行う
std::rotl()
とstd::rotr()
を追加 - 連続した0もしくは1のビットを数える
std::countl_zero()
、std::countl_one()
、std::countr_zero()
、std::countr_one()
、および立っているビットを数えるstd::popcount()
を追加 - エンディアンを表す列挙型として
std::endian
を追加
- Strict Aliasing規則に抵触しないビットレベルの再解釈キャストである
- 型制約のための要件ライブラリとして
<concepts>
を追加 - 言語機能であるコルーチンを制御するライブラリとして
<coroutine>
を追加 - スレッドの実行を停止させるメカニズムとして
<stop_token>
を追加し、停止に対応したスレッドクラスとして<thread>
にstd::jthread
クラスを追加 - 軽量な同期プリミティブであるセマフォのライブラリとして
<semaphore>
を追加 - スレッド調整メカニズムとして、ラッチライブラリの
<latch>
、バリアライブラリの<barrier>
を追加 - イテレータの組ではなく、コンテナや配列、部分的なコンテナなどを扱う範囲ライブラリとして
<ranges>
を追加- 既存のイテレータの組を扱うアルゴリズムは、
std::ranges
名前空間に範囲版アルゴリズムが追加される
- 既存のイテレータの組を扱うアルゴリズムは、
- ソースコードの位置を取得するライブラリとして
<source_location>
を追加
std
名前空間以下の関数テンプレートをユーザーが特殊化することを禁止する (参照 : P0551R3)
- 連想コンテナに、要素がコンテナに含まれているかを判定する
contains()
メンバ関数を追加 - 順序付き連想コンテナと同様に、非順序連想コンテナの検索処理で、一時オブジェクトが生成されるコストを抑える拡張を追加。ハッシュ計算を行う関数オブジェクトに
transparent_key_equal
が定義されていれば、透過的な検索が使用できる。std::hash
クラスのページを参照 - 各コンテナの非メンバ関数として、要素を削除する
std::erase()
関数とstd::erase_if()
関数を追加 std::forward_list
とstd::list
のメンバ関数remove()
、remove_if()
、unique()
の戻り値型を、void
からContainer::size_type
に変更std::array
クラスの比較演算子、fill()
メンバ関数、swap()
メンバ関数、swap()
非メンバ関数にconstexpr
を追加。このクラスのメンバ関数はすべてconstexpr
に対応した- 組み込み配列を
std::array
に変換する関数としてstd::to_array()
を追加 <iterator>
に、符号付き整数としてコンテナの要素数を取得するstd::ssize()
関数を追加std::allocator
、およびstd::vector
とstd::basic_string
をconstexpr
対応
<algorithm>
の多くの関数にconstexpr
を追加<algorithm>
に、要素位置をシフトするstd::shift_left()
、std::shift_right()
を追加- 一貫比較への対応のため、
<algorithm>
にstd::lexicographical_compare_3way()
およびstd::compare_3way()
を追加 <numeric>
の数値計算アルゴリズムをムーブに対応
std::back_insert_iterator
クラス、std::front_insert_iterator
クラス、std::insert_iterator
クラスのコンストラクタ、代入演算子、間接参照演算子、インクリメント演算子、およびstd::back_inserter()
、std::front_inserter()
、std::inserter()
にconstexpr
を追加。これらのクラスのメンバ関数はすべてconstexpr
に対応した
<functional>
に、std::reference_wrapper
<T>
型をT&
型に展開するstd::unwrap_reference
型特性、std::decay
+std::reference_wrapper
<T>
型の展開をするstd::unwrap_ref_decay
型特性を追加std::reference_wrapper
クラス、std::ref()
関数、std::cref()
関数のテンプレートパラメータT
型に不完全型を指定することを許可- メンバ関数の部分適用をかんたんにするために、プレースホルダーの指定なく引数を先頭から順に束縛する
std::bind_front()
関数を追加 std::invoke()
、std::reference_wrapper
の各操作、std::not_fn()
、std::bind()
、std::mem_fn()
をconstexpr
対応
- 数値とポインタの中点を求める関数として、
<numeric>
にstd::midpoint()
関数を追加 - 浮動小数点数を線形補間する関数として、
<cmath>
にstd::lerp()
関数を追加
std::basic_string
クラスとstd::basic_string_view
クラスに、先頭の部分文字列を判定するstarts_with()
メンバ関数、末尾の部分文字列を判定するends_with()
メンバ関数を追加std::basic_string
::
reserve()
メンバ関数の、メモリの縮小機能を削除し、伸長のみとする。std::char_traits
クラスのmove()
、copy()
、assign()
静的メンバ関数にconstexpr
を追加
<memory>
に、std::atomic
クラスのstd::shared_ptr
とstd::weak_ptr
に対する特殊化を追加std::atomic
クラスの浮動小数点数型に対する特殊化を追加- アトミッククラスに対するブロッキング同期の機能として
wait()
、notify_one()
、notify_all()
を追加 - ロックフリーであることが保証されたアトミック整数型の別名として
atomic_signed_lock_free
とatomic_unsigned_lock_free
を追加 std::memory_order
の列挙子にスコープをもたせたstd::atomic_flag
クラスに、bool
値を読み込むメンバ関数test()
を追加- 非アトミックなオブジェクトにアトミック操作を適用するためのクラス
std::atomic_ref
を追加 - ベクトル化の実行ポリシーとして、
<execution>
にstd::execution::unsequenced_policy
型とstd::execution::unseq
タグを追加
- 同期ストリームの追加にともなって、
<ostream>
に、同期ストリーム関係の出力マニピュレータを追加 operator>>
(basic_istream&, CharT*)
をoperator>>(basic_istream&, CharT (&)[N])
に修正operator<<
に、wchar_t
(char
版のみ)、char8_t
、char16_t
、char32_t
のdelete宣言を追加std::istream_iterator
について、要件の書き方を整理し、振る舞いをより明確化std::basic_stringbuf
、std::basic_istringstream
、std::basic_ostringstream
クラスに、アロケータを伝播させるためのインタフェースを追加
std::make_shared()
とstd::allocate_shared()
を配列に対応- スマートポインタをデフォルト初期化で構築するヘルパ関数として、
std::make_unique_default_init()
、std::make_shared_default_init()
、std::allocate_shared_default_init()
を追加 - ポインタを生ポインタに変換する
std::to_address()
を追加 std::pointer_traits
::
pointer_to()
関数にconstexpr
を追加
<memory>
に、Nバイトアライメントされたポインタであることをコンパイラに伝えるstd::assume_aligned()
関数を追加<memory>
に、uses allocator構築をサポートするユーティリティ関数として、std::uses_allocator_construction_args()
、std::make_obj_using_allocator()
、std::uninitialized_construct_using_allocator()
を追加std::pmr::polymorphic_allocator
に、以下の変更を追加:- クラステンプレートのデフォルトテンプレート引数を
std::byte
型とした void*
のバイト列をメモリ確保するallocate_bytes()
、解放するdeallocate_bytes()
メンバ関数を追加- 指定した型のメモリを確保する
allocate_object()
、解放するdeallocate_object()
を追加 - 指定した型のメモリ確保と構築をする
new_object()
、破棄と解放をするdelete_object()
を追加
- クラステンプレートのデフォルトテンプレート引数を
std::swap()
関数にconstexpr
を追加std::exchange()
関数にconstexpr
を追加std::complex
クラスをconstexpr
に対応std::pair
クラスのコンストラクタ、代入演算子、swap()
メンバ関数、swap()
非メンバ関数にconstexpr
を追加。このクラスのメンバ関数はすべてconstexpr
に対応したstd::tuple
クラスのコンストラクタ、代入演算子、swap()
メンバ関数、swap()
非メンバ関数にconstexpr
を追加。このクラスのメンバ関数はすべてconstexpr
に対応した
std::filesystem::create_directory()
とstd::filesystem::create_directories()
の仕様が直感的ではなく、すでにディレクトリが存在している場合にエラーとなっていた。C++20ではその状況ではエラーにならないようにする (エラーではなくfalse
が返る)
<type_traits>
に、constexpr関数が定数式評価されたかを判定する特殊な関数std::is_constant_evaluated()
を追加<type_traits>
に、型のCV修飾と参照を除去する型特性クラスとしてstd::remove_cvref
を追加<type_traits>
に、受け取った型をそのまま返すstd::type_identity
を追加<type_traits>
に、例外送出せずに暗黙の型変換が可能かを判定するstd::is_nothrow_convertible
を追加<type_traits>
に、要素数が判明している配列型かを判定するstd::is_bounded_array
、要素数が不明な配列型かを判定するstd::is_unbounded_array
を追加<type_traits>
に、レイアウト互換性、ポインタ変換可能性を判定する以下の型特性を追加:- 2つの型にレイアウト互換があるかを判定する
std::is_layout_compatible
- 基底クラスと派生クラスの間でポインタ変換可能かを判定する
std::is_pointer_interconvertible_base_of
- メンバポインタがクラスのポインタに変換可能かを判定する
is_pointer_interconvertible_with_class()
- 2つの互換レイアウトをもつメンバポインタが共通位置にあるかを判定する
std::is_corresponding_member()
- 2つの型にレイアウト互換があるかを判定する
- 一貫比較機能にとって比較演算子の定義が容易になったため、不要になった演算子の簡潔定義機能である
std::rel_ops
を非推奨化 std::basic_string
::
reserve()
メンバ関数が、メモリの縮小をしなくなったため、デフォルト引数0
を非推奨可
- C++11で
allocator_traits
クラスが導入されたことでC++17から非推奨化されていた、allocator
の以下のメンバを削除:size_type
型difference_type
型pointer
型const_pointer
型reference
型const_reference
型rebind
型address()
メンバ関数allocate()
メンバ関数のhint
パラメータmax_size()
メンバ関数construct()
メンバ関数destroy()
メンバ関数
- C++11で
allocator_traits
クラスが導入されたことでC++17から非推奨化されていた、要素型を再束縛するためのallocator<void>
特殊化を非推奨化 - C++17で非推奨化されていた、
constexpr
で扱える型の分類であるis_literal_type
型特性を削除 - C++17で非推奨化されていた、一時的なメモリ確保のための
std::get_temporary_buffer()
関数とstd::return_temporary_buffer()
関数を削除 - C++17で非推奨化されていた
raw_storage_iterator
クラスを削除 not_fn()
の追加にともない、C++17から非推奨化されていた以下の機能を削除:not1()
関数not2()
関数unary_negate
クラスbinary_nagate
クラス- 標準関数オブジェクトの
result_type
、argument_type
、first_argument_type
、second_argument_type
型
- C++17から非推奨化されていた
shared_ptr
::
unique()
を削除 invoke_result
の追加にともない、C++17から非推奨化されていたresult_of
を削除- C++17での
uncaught_exceptions()
の追加にともない、非推奨化していたuncaught_exception()
を削除 - C++17で非推奨化されていたC互換ライブラリ
<ccomplex>
,<cstdalign>
,<cstdbool>
,<ctgmath>
を削除。また、C++ではなにも定義されないC互換ライブラリ<ciso646>
を削除