最終更新日時(UTC):
が更新

履歴 編集

C++20

概要

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とすることで、列挙値のスコープ指定を省略できるようにする

変数

言語機能 説明
指示付き初期化
構造化束縛を拡張して通常の変数宣言のように使用できるようにする 記憶域指定子としてstaticthread_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_tchar32_tの文字・文字列リテラルを、文字コードUTF-16/32に規定 __STDC_UTF_16____STDC_UTF_32__の定義に関係なく、char16_tchar32_tのリテラルをUTF-16/32文字コードに規定する

関数

言語機能 説明
[[nodiscard]]属性に理由となる文字列を付加できるようにする 関数の戻り値を無視してはならない理由を関数宣言に持たせ、警告メッセージに役立てる

制御構文

言語機能 説明
初期化式をともなう範囲for文 範囲for文スコープで使用する変数の初期化のための構文を追加
範囲for文がカスタマイゼーションポイントを見つけるルールを緩和 begin()/end()メンバ関数のどちらかが見つからなかった場合に非メンバ関数のbegin()/end()を探しにいく
当たる確率が高い分岐と、当たる確率が低い分岐をコンパイラに伝える属性を追加 コンパイラが分岐予測するためのヒントとする

テンプレート

言語機能 説明
コンセプト テンプレートパラメータに対する制約を行う
型の文脈で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を追加
  • 型制約のための要件ライブラリとして<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_liststd::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::vectorstd::basic_stringconstexpr対応

アルゴリズム

イテレータ

関数オブジェクト

数値計算

文字列

並行・並列処理

入出力

  • 同期ストリームの追加にともなって、<ostream>に、同期ストリーム関係の出力マニピュレータを追加
  • operator>>(basic_istream&, CharT*)operator>>(basic_istream&, CharT (&)[N])に修正
  • operator<<に、wchar_t (char版のみ)、char8_tchar16_tchar32_tのdelete宣言を追加
  • std::istream_iteratorについて、要件の書き方を整理し、振る舞いをより明確化
  • std::basic_stringbufstd::basic_istringstreamstd::basic_ostringstreamクラスに、アロケータを伝播させるためのインタフェースを追加

スマートポインタ

メモリ

ユーティリティ

ファイルシステム

型特性

  • <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()

機能の非推奨化

  • 一貫比較機能にとって比較演算子の定義が容易になったため、不要になった演算子の簡潔定義機能である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から非推奨化されていた以下の機能を削除:
  • 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>を削除