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

履歴 編集

C++23

概要

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

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

言語機能

言語機能 説明
(符号付き)size_tリテラルのためのサフィックス 42z/42Zとすることでsize_tに対応する符号付き整数型のリテラルとする
部分特殊化の汎用化仕様 変数テンプレートの部分特殊化を許可するために部分特殊化の仕様を汎用化
文字・文字列リテラル中の数値・ユニバーサルキャラクタのエスケープに関する問題解決
スコープと名前ルックアップの仕様整理 複雑で不完全になっているスコープと名前ルックアップの仕様を整理し、一部の問題を解決する
ラムダ式で()を省略できる条件を緩和 キャプチャや修飾をともなってもパラメータリストが空であれば()を省略できる
if consteval コンパイル時の文脈かどうかで分岐させる
定数式の文脈でのboolへの縮小変換を許可 if constexpr(flags & Flags::Exec)static_assert(N);を許可
行末スペースを無視するよう規定 行末が\でおわっていた場合にMSVCは行の継続をしない実装になっていたため動作を共通化するため仕様を規定
アクセス制御の異なるメンバ変数のレイアウトを宣言順に規定 アクセス制御の異なるメンバ変数のレイアウトが実装によって異なっていたため仕様を規定
異なる文字エンコーディングをもつ文字列リテラルの連結を不適格とする auto a = u8"" L"";のような異なる文字エンコーディング同士での文字列リテラルを連結を禁止する
契約に基づくプログラミング (まだ入っていない) 事前条件、事後条件、表明を宣言する新たな属性構文を追加

小さな変更

言語機能 説明
参照するPOSIX規格を更新 新しいPOSIX規格の機能を標準C++が参照していたため、参照するPOSIX規格のバージョンを更新

ライブラリ更新の概要

新ライブラリ

  • スタックトレースを取得するためのライブラリとして<stacktrace>を追加
  • CとC++の間でのアトミック操作の相互運用のため、C互換ライブラリとして<stdatomic.h>を追加
  • 外部から提供されるメモリバッファでストリーム処理を行うライブラリとして<spanstream>を追加
  • 契約違反のハンドリングをするためのライブラリとして<contract>を追加 (まだ入っていない)

コンテナ

  • std::stackstd::queueに、イテレータのペアをとるコンストラクタを追加
  • auto v = std::vector(v, alloc);のようなアロケータ引数をともなう場合のクラステンプレートのテンプレート引数推論が動作しなかったため、各コンテナクラスのコンストラクタにおけるアロケータパラメータの型をconst Allocator&からconst std::type_identity_t<Allocator>&に修正
  • N要素のメモリアロケート時にアロケータが実際にどれくらいのメモリを確保したかを得られるインタフェースとして、std::allocatorクラスに、allocate_at_least()メンバ関数を追加
  • std::pairの転送コンストラクタにデフォルトテンプレート引数を追加することで、{}のような型推論ができない引数を渡した場合でも完全転送が行われるよう修正

アルゴリズム

  • <algorithm>に、範囲の先頭が指定した範囲と合致するかを判定するstd::starts_with()、範囲の末尾が指定した範囲と合致するかを判定するstd::ends_with()を追加

文字列

  • std::basic_stringクラスとstd::basic_string_viewクラスに、文字列内に指定した文字・文字列が含まれているかを判定するメンバ関数contains()を追加
  • std::basic_string_viewのコンストラクタに、範囲をとるオーバーロードを追加
  • std::string s = nullptr;のような文字列オブジェクトにnullptrを代入するようなコードはバグの元であるため、std::basic_stringstd::basic_string_viewに、nullptr_tをとるコンストラクタをdelete定義として追加

関数オブジェクト

  • std::invoke()の戻り値型を指定するバージョンであるstd::invoke_r()

スマートポインタ

  • <memory>std::owner_hashstd::owner_equalが追加され、非順序連想コンテナのキーとしてstd::weak_ptrを使用できるようになった
  • <memory>に、出力ポインタと入出力ポインタの抽象であるstd::out_ptrstd::inout_ptrを追加

ユーティリティ

型情報

型特性

  • <type_traits>に、スコープ付き列挙型かを判定する型特性std::is_scoped_enumを追加
  • <type_traits>に、第1テンプレート引数についている型修飾を第2テンプレート引数の型に付加する型特性として、以下を追加:
    • std::copy_const
    • std::copy_volatile
    • std::copy_cv
    • std::copy_reference
    • std::copy_extent
    • std::copy_all_extents
    • std::copy_pointer
    • std::copy_all_pointers
    • std::copy_cvref
  • <type_traits>に、第1テンプレート引数についている型修飾を外す型特性として、以下を追加:
    • std::remove_all_pointers

機能の非推奨化

機能の削除