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

履歴 編集

C++20

概要

C++20とは、2020年中に改訂される予定の、C++バージョンの通称である。

このバージョンは、策定中はC++2aと呼ばれることがあった。「202a年にリリースされる」という伏せ字として「a」が使われているが、3年周期に次のバージョンが策定されることが決まっているため、伏せ字になっている年数がずれることはない。

言語機能

言語機能 説明
ビットフィールドのメンバ変数初期化 ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する
ラムダ式のキャプチャとして[=, this]を許可する デフォルトコピーキャプチャとthisポインタのコピーキャプチャを両方指定できるようにする
ジェネリックラムダのテンプレート構文 ジェネリックラムダでテンプレートパラメータを定義できるようにする
const修飾されたメンバポインタの制限を修正 .*演算子での左辺値のconstメンバ関数呼び出しを許可する
可変引数が空でない場合のトークン置換 プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処
指示付き初期化
コンセプト
範囲for文で初期化式を記述できるようにする
暗黙のラムダキャプチャを簡略化
関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正
デフォルトのコピーコンストラクタと非constなコンストラクタが衝突する問題を修正
評価されない文脈でconstexpr関数が定数式評価されることを規定
一貫性ある比較
ラムダ式の制約
特殊化のアクセスチェック
状態を持たないラムダ式を、デフォルト構築可能、代入可能とする
PODを非推奨化
評価されない文脈でのラムダ式
空オブジェクトを言語サポート [[no_unique_address]]属性を導入し、空の型のオブジェクトをほかのオブジェクトと共有する最適化を許可する
範囲for文がカスタマイゼーションポイントを見つけるルールを緩和 begin()/end()メンバ関数のどちらかが見つからなかった場合に非メンバ関数のbegin()/end()を探しにいく
friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可 構造化束縛の仕様として公開メンバ変数のみを取り出せるようになっていたが、friend指定された関数からは非公開メンバ変数にもアクセスできるようにする
構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和 非テンプレートのget()メンバ関数が見つかった場合は、非メンバ関数のget()を探しにいく
型の文脈でtypenameの省略を許可 型しか現れない文脈では、依存名を解決するためのtypenameキーワードを省略できるようにする
ラムダ式の初期化キャプチャでのパック展開を許可 [...args = std::move(args)]のようなキャプチャを許可
当たる確率が高い分岐と、当たる確率が低い分岐をコンパイラに伝える属性を追加 コンパイラが分岐予測するためのヒントとする
宇宙船演算子に対称性をもたせる a <=> bが妥当であればb <=> aも妥当とする

ライブラリ更新の概要

新ライブラリ

  • <version>ヘッダを新設する。ここでは、実装依存の情報 (バージョンやリリース日付など) が標準ライブラリの実装によって定義される
  • <chrono>ヘッダに、カレンダーとタイムゾーンの機能を拡張
  • 任意のシーケンスの部分シーケンスを参照するライブラリとして<span>を追加
  • 出力ストリームを同期するライブラリとして<syncstream>を追加

取り決め

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

アルゴリズム

  • <algorithm>の検索、ソート関係にconstexprを追加
  • <numeric>の数値計算アルゴリズムをムーブに対応

並行処理

  • std::atomicクラスのスマートポインタに対する特殊化を追加
  • std::atomicクラスの浮動小数点数型に対する特殊化を追加
  • std::memory_orderの列挙子にスコープをもたせた

入出力

  • 同期ストリームの追加にともなって、<ostream>に、同期ストリーム関係の出力マニピュレータを追加

スマートポインタ

ユーティリティ

型特性