最終更新日時(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演算子が呼び出される前にデストラクタが呼ばれないようにするオプションを追加

変数

言語機能 説明
指示付き初期化
構造化束縛を拡張して通常の変数宣言のように使用できるようにする 記憶域指定子としてstaticthread_localの指定を許可
丸カッコの値リストからの集成体初期化を許可 T x{1, 2, 3};と同様にT x(1, 2, 3);でも集成体初期化できるようにする
new式での配列要素数の推論 double* p = new double[]{1,2,3};を許可

整数

言語機能 説明
符号付き整数型が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文字コードに規定する

制御構文

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

テンプレート

言語機能 説明
コンセプト テンプレートパラメータに対する制約を行う
型の文脈でtypenameの省略を許可 型しか現れない文脈では、依存名を解決するためのtypenameキーワードを省略できるようにする
非型テンプレートパラメータとしてクラス型を許可する std::strong_equalityに変換可能な非メンバ関数<=>をもつ型を、非型テンプレートパラメータとして使用できるようにする
関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正

定数式

言語機能 説明
評価されない文脈でconstexpr関数が定数式評価されることを規定
定数式からの仮想関数の呼び出しを許可 仮想関数にconstexprを付けられない制限を解除
定数式でのdynamic_cast、多態的なtypeidを許可 定数式での動的多態を許可
constexpr関数内でのtry-catchブロックを許可 constexpr関数内での例外の捕捉を許可する
即時関数 constevalキーワードを追加し、常に定数式評価されるよう指定できるようにする
定数式内での共用体のアクティブメンバの変更を許可 共用体メンバの書き換えを定数式内で行えるようにする

ラムダ式

言語機能 説明
ジェネリックラムダのテンプレート構文 ジェネリックラムダでテンプレートパラメータを定義できるようにする
ラムダ式のキャプチャとして[=, this]を許可する デフォルトコピーキャプチャとthisポインタのコピーキャプチャを両方指定できるようにする
[=]によるthisの暗黙のキャプチャを非推奨化 コピーのデフォルトキャプチャでは、thisポインタをキャプチャされなくする
ラムダ式の制約
暗黙のラムダキャプチャを簡略化
状態を持たないラムダ式を、デフォルト構築可能、代入可能とする
評価されない文脈でのラムダ式
ラムダ式の初期化キャプチャでのパック展開を許可 [...args = std::move(args)]のようなキャプチャを許可
構造化束縛したビットフィールドの参照キャプチャ ビットフィールドを含む構造化束縛をした場合にラムダ式で参照キャプチャできない規定を緩和し、ビットフィールドを直接参照キャプチャ、もしくはデフォルト参照キャプチャして使用しなければ適格とする

名前空間

言語機能 説明
入れ子名前空間定義でのインライン名前空間 namespace ns1::inline ns2::ns3 {}のように、入れ子名前空間を定義する式にインライン名前空間の指定を含められるようにする

モジュール化

言語機能 説明
モジュール ヘッダファイル・ソースファイル、インクルードに変わる仕組みとしてモジュールを導入する

並行・並列処理

言語機能 説明
コルーチン 関数実行を中断・再開する仕組みとしてコルーチンを導入する

プリプロセッサ

言語機能 説明
可変引数が空でない場合のトークン置換 プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処

機能の非推奨化

言語機能 説明
PODを非推奨化
[=]によるthisの暗黙のキャプチャを非推奨化 コピーのデフォルトキャプチャでは、thisポインタをキャプチャされなくする

機能の削除

言語機能 説明
throw()による例外送出しない指定を削除 代わりにnoexceptを使用すること
ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止 コンストラクタがdelete宣言されているクラスを、集成体初期化によってコンストラクタ呼び出しを回避して構築できてしまっていた技法を禁止

小さな変更

言語機能 説明
Unicode標準への参照を更新 標準C++からISO/IEC 10646への参照を更新し、古い固定バージョンへの参照をやめる

ライブラリ更新の概要

新ライブラリ

  • <version>ヘッダを新設する。ここでは、実装依存の情報 (バージョンやリリース日付など) が標準ライブラリの実装によって定義される
  • <chrono>ヘッダに、カレンダーとタイムゾーンの機能を拡張
  • 任意のシーケンスの部分シーケンスを参照するライブラリとして<span>を追加
  • 出力ストリームを同期するライブラリとして<syncstream>を追加
  • <compare>ヘッダを新設する。ここでは、一貫比較 (宇宙船演算子) をサポートするための型と比較関数が定義される
  • <bit>ヘッダを新設する
    • Strict Aliasing規則に抵触しないビットレベルの再解釈キャストであるstd::bit_cast()関数を追加
    • 2の乗数関係の関数として、整数値が2の累乗かを判定するstd::ispow2()関数、整数値を2の累乗値に切り上げるstd::ceil2()関数、整数値を2の累乗値に切り下げるstd::floor2()関数、2を底とした整数値の対数を求めて1を足すstd::log2p1()関数を追加
  • 型制約のための要件ライブラリとして<concepts>を追加
  • 言語機能であるコルーチンを制御するライブラリとして<coroutine>を追加
  • イテレータの組ではなく、コンテナや配列、部分的なコンテナなどを扱う範囲ライブラリとして<ranges>を追加
    • 既存のイテレータの組を扱うアルゴリズムは、std::ranges名前空間に範囲版アルゴリズムが追加される
  • 契約違反のハンドリングをするためのライブラリとして<contract>を追加

取り決め

  • std名前空間以下の関数テンプレートをユーザーが特殊化することを禁止する (参照 : P0551R3)

コンテナ

  • 連想コンテナに、要素がコンテナに含まれているかを判定するcontains()メンバ関数を追加
  • 順序付き連想コンテナと同様に、非順序連想コンテナの検索処理で、一時オブジェクトが生成されるコストを抑える拡張を追加。ハッシュ計算を行う関数オブジェクトにtransparent_key_equalが定義されていれば、透過的な検索が使用できる。std::hashクラスのページを参照
  • 非順序連想コンテナの検索メンバ関数find()count()contains()equal_range()に、事前計算したハッシュ値を指定するオーバーロードを追加。これによって、ハッシュ値をキャッシュして検索を高速化できる
  • 各コンテナの非メンバ関数として、要素を削除するstd::erase()関数とstd::erase_if()関数を追加
  • std::forward_liststd::listのメンバ関数remove()remove_if()unique()の戻り値型を、voidからContainer::size_typeに変更
  • std::arrayクラスの比較演算子、fill()メンバ関数、swap()メンバ関数、swap()非メンバ関数にconstexprを追加。このクラスのメンバ関数はすべてconstexprに対応した
  • <iterator>に、符号付き整数としてコンテナの要素数を取得するstd::ssize()関数を追加

アルゴリズム

数値計算

イテレータ

文字列

並行・並列処理

入出力

  • 同期ストリームの追加にともなって、<ostream>に、同期ストリーム関係の出力マニピュレータを追加
  • operator>>(basic_istream&, CharT*)operator>>(basic_istream&, CharT (&)[N])に修正
  • std::istream_iteratorについて、要件の書き方を整理し、振る舞いをより明確化

スマートポインタ

メモリ

ユーティリティ

ファイルシステム

型特性

機能の非推奨化

  • 一貫比較機能にとって比較演算子の定義が容易になったため、不要になった演算子の簡潔定義機能である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>を削除