最終更新日時: 2026年07月06日 12時41分09秒 (JST)
Akira Takahashi が更新

履歴 編集

# C++26

## 概要

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

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

## 言語機能

### 変数

言語機能 | 説明
--- | ---
`std::initializer_list`の配列を静的記憶域に配置する | `std::vector v = {1, 2, 3};`のような初期化で初期化子リストを静的記憶域に配置することで無駄なコピーをなくす
宣言のみで使用しない変数の名前として`_`をサポート | 変数名`_`は暗黙で`[[maybe_unused]]`が指定される
不完全型へのポインタに対する`delete`を不適格とする | 未定義動作を引き起こす操作をコンパイルエラーとする
返却された左辺値から暗黙変換された一時オブジェクトが参照に束縛されることを禁止する | 寿命切れの変数によって引き起こされるバグを防止する
要素数不明の配列を集成体初期化する規則を明確化 | 配列要素の集成体初期化で`{}`が省略された場合の矛盾していた規定を修正
未初期化変数の読み取りをエラー性動作とする | 初期化されていない自動変数の読み取りの安全性を規定する
構造化束縛でパックを導入できるようにする | タプルを分解する際に複数の変数をパックとして宣言できるようにする。`auto [a, ...xs] = f();`

### 文字列

言語機能 | 説明
--- | ---
文字列リテラルの文字エンコーディング失敗を不適格とする | 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする
コンパイル時にのみ使用される文字列の扱いを明確化 | `static_assert`や`[[deprecated]]`などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定

### 分岐・ループ

言語機能 | 説明
--- | ---
条件式での構造化束縛の使用を許可 | 式全体を`bool`値に変換できる場合に条件式で構造化束縛を使用できることとする
空の無限ループは未定義動作ではないと規定 | 並行プログラムの進行保証などを考慮して空の無限ループを未定義動作ではないものとする

### 関数

言語機能 | 説明
--- | ---
関数宣言を削除する理由を指定できるようにする | `f() = delete("reason");`
契約プログラミングをサポートする | 関数の事前条件、事後条件、不変条件を記述できるようにする

### クラス

言語機能 | 説明
--- | ---
共用体の特殊メンバ関数のトリビアル化 | 非トリビアルな型をメンバにもつ共用体のデフォルトコンストラクタとデストラクタをトリビアルにし、未初期化ストレージとして使用可能にする
共用体の生存期間ルールの調整 | `union`メンバの活性化や生存期間に関する規則を整理して`constexpr`評価などの一貫性を改善する
配置newの解放処理を明確化 | 配置`new`で確保したメモリの解放処理の取り扱いに関するルールを明確化する

### 属性

言語機能 | 説明
--- | ---
属性の無視性を見直し | 構文として適格な属性のみを無視できるようにし、そうでない属性の使用を不適格とする
構造化束縛への属性を許可 | `auto [a, b [[maybe_unused]], c] = f();`のように構造化束縛の要素に対して属性を付加できるようにする

### テンプレート

言語機能 | 説明
--- | ---
パラメータパックへのインデックスアクセスを許可 | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする
制約式内での畳み込み式の順序付け | 畳み込み式を含む制約の包摂関係を認識できるようにし、オーバーロード解決の曖昧さを解消する
可変引数テンプレートで`friend`宣言をできるようにする | クラステンプレートの可変引数テンプレートでまとめて`friend`宣言できるようにする
コンセプトと変数テンプレートをテンプレート引数として渡せるようにする | テンプレートテンプレートパラメータとして、クラステンプレートやエイリアステンプレートに加え、コンセプトと変数テンプレートも渡せるようにする
可変引数テンプレートの半順序を再検討する | 可変引数テンプレートの部分特殊化の半順序ルールを再検討して、より一貫したルールにする
テンプレートテンプレートパラメータに対するクラステンプレートパラメータ引数推論 | テンプレートテンプレートパラメータからクラステンプレート引数を推論できるようにクラステンプレートのテンプレート引数推論を拡張する
「immediate context」の定義を明確化 | SFINAEにおける「immediate context」の用語を厳密に定義し、置換失敗の範囲を明確にする

### 定数式

言語機能 | 説明
--- | ---
静的リフレクション | リフレクション演算子`^^`と`std::meta::info`型によりコンパイル時にさまざまな情報を取得できる
コンパイル時のタプルやリストを展開処理する`template for`文 | タプル・構造体・Range・パラメータパックなどの各要素に対してコンパイル時に文を展開する`template for`文を追加
定数式での`void*`からポインタ型へのキャストを許可 | 型消去のために`void*`からポインタ型へのキャストを許可する
`static_assert`の診断メッセージにユーザーが生成した文字列の指定を許可 | `constexpr`な`S.size()`と`S.data()`メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする
`constexpr`配置`new` | 定数式の文脈での配置`new`を許可
`constexpr`構造化束縛の許可と、`constexpr`参照の制限緩和 | 定数式に対する構造化束縛を許可し、関連して`constexpr`参照の制限を緩和して自動変数も参照できるようにする
定数評価での例外送出を許可 | 定数式の文脈での例外の送出と捕捉を許可
`constexpr`仮想継承を許可 | 定数式の文脈での仮想継承を許可
定数評価の開始・終了タイミングを明確化 | 定数評価がどのタイミングで開始・終了するかを明確化し、constexprコンテキストの規則を整える

### プリプロセッサ

言語機能 | 説明
--- | ---
ファイルを読み込む`#embed`命令を追加 | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる
プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更 | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更
`#line`ディレクティブの制約を現実の実装に合わせて緩和する | `#line 0`や`#line 2147483648`のような行番号指定を不適格としていたが、条件付きサポートとして許可する

### ソースコード

言語機能 | 説明
--- | ---
基本文字集合に@、$、`を追加 | C言語との互換性のためにこれらの文字を基本文字集合に追加

### モジュール

言語機能 | 説明
--- | ---
モジュール宣言でのモジュール名のマクロ展開を禁止する | `export module MACRO_NAME;`を禁止
`main`関数をグローバルモジュールに含められるようにする | `main`関数に`extern "C++"`を指定できるようにすることで名前付きモジュールに含められるようにする
モジュール宣言より前での`#line`ディレクティブの使用を許可する | モジュール宣言より前での`#line`ディレクティブの使用を禁止していたのは過度な制限だった

### 機能の非推奨化

言語機能 | 説明
--- | ---
先行するカンマのない省略記号を非推奨化 | `void f(int, ...);`はOK。`void f(int...);`は非推奨

### 機能の削除

言語機能 | 説明
--- | ---
非推奨だった組み込み配列の比較を削除 | C++20で非推奨となっていた配列比較を削除
非推奨となっていた列挙型の算術変換を削除 | C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除

## ライブラリ更新の概要

### 新ライブラリ

- 文字列エンコーディングを識別するライブラリとして、`<text_encoding>`を追加
- 要素のメモリ位置が安定するシーケンスコンテナのライブラリとして`<hive>`を追加
- 並行処理におけるデータの参照・更新を行うRCU (Read Copy Update) のライブラリとして、`<rcu>`を追加
- 並行処理において参照中のデータが更新されないよう保護するハザードポインタのライブラリとして、`<hazard_pointer>`を追加
- データ並列ライブラリとして、`<simd>`を追加
- デバッグサポートのライブラリとして`<debugging>`を追加
- 線形代数ライブラリとして`<linalg>`を追加
- コンパイル時に容量を固定する可変長配列クラスのライブラリとして`<inplace_vector>`を追加
- C23の互換ライブラリとして、ビット操作ライブラリ`<stdbit.h>`と、検査付き整数演算ライブラリ`<stdckdint.h>`を追加。`<cstd…>`形式のライブラリは追加されない

### 全体

- 標準ライブラリに付加された、戻り値を無視した際に警告を出力する`[[nodiscard]]`属性を削除

### コンテナ

- `std::vector<bool>::reference`のプロキシ操作として、`const`修飾付きの代入と`swap()`メンバ関数を追加
- `std::mdspan`から部分ビューを取り出す`std::submdspan()`を追加
- `std::mdspan`に、インデックスを指定して要素を取り出す`at()`メンバ関数を追加
- `std::mdspan`に対する`std::dextents`指定の冗長さを解決する`std::dims`を追加
- `std::mdspan`のレイアウトとして、`std::layout_left_padded`と`std::layout_right_padded`を追加
- `<mdspan>`に、要素アクセスにアライメント保証を与える`std::aligned_accessor`を追加
- `std::span`に、インデックスアクセスのための`at()`メンバ関数を追加
- 連想コンテナの以下のメンバ関数に、一時オブジェクトが生成されるコストを抑える拡張を追加
  - `std::map`
    - `operator[]`
    - `at()`
    - `try_emplace()`
    - `insert_or_assign()`
  - `std::set`
    - `insert()`
  - `std::unordered_map`
    - `operator[]`
    - `at()`
    - `try_emplace()`
    - `insert_or_assign()`
    - `bucket()`
  - `std::unordered_multimap`
    - `bucket()`
  - `std::unordered_set`
    - `insert()`
    - `bucket()`
  - `std::unordered_multiset`
    - `bucket()`
- `std::span`と`std::mdspan`の推論補助を改善
- `std::views::concat`を追加
- `std::views::cache_latest`を追加
- `std::views::as_input`を追加。これはパフォーマンス向上のために、Rangeを入力Rangeかつ非`common_range` (イテレータと番兵の型を別する) に変換する
- Range関係の、償却定数時間での要素追加を行う機能を追加
  - 各viewクラスに`reserve_hint()`メンバ関数を追加
  - `std::ranges::reserve_hint()`関数を追加
  - `std::ranges::approximately_sized_range`コンセプトを追加
- インデックス列を生成する`std::views::indices`を追加
- 連続イテレータのコンセプト`contiguous_iterator`に、ポインタに変換できることを要件として追加
- `std::initializer_list`クラスを以下のように変更
  - 独自に定義されていた`std::begin()` / `std::end()`のオーバーロードを削除 (`std::cbegin()`や`std::rend()`のようなオーバーロードがなかったため、ほかとの不整合があった)
  - メンバ関数`data()`を追加
  - メンバ関数`empty()`を追加
- `std::valarray`クラスを以下のように変更
  - 独自に定義されていた`std::begin()` / `std::end()`のオーバーロードを削除 (`std::cbegin()`や`std::rend()`のようなオーバーロードがなかったため、ほかとの不整合があった)
  - メンバ型`iterator` / `const_iterator`を追加
  - メンバ関数`begin()` / `end()`を追加
- イテレータインタフェースの非メンバ関数`std::begin()` / `std::end()` / `std::cbegin()` / `std::cend()` / `std::rbegin()` / `std::rend()` / `std::crbegin()` / `std::crend()` / `std::size()` / `std::ssize()` / `std::empty()` / `std::data()`を以下のように変更
  - `std::initializer_list`型に対するオーバーロードを削除 (専用のオーバーロードを用意しなくても汎用オーバーロードが使用できるようになった)
  - 条件付き`noexcept`指定を追加
- Rangeインタフェースの非メンバ関数`std::ranges::begin()` / `std::ranges::end()` / `std::ranges::cbegin()` / `std::ranges::cend()` / `std::ranges::rbegin()` / `std::ranges::rend()` / `std::ranges::crbegin()` / `std::ranges::crend()` / `std::ranges::size()` / `std::ranges::ssize()` / `std::ranges::empty()` / `std::ranges::data()`を以下のように変更
  - `std::initializer_list`型に対するオーバーロードを削除 (専用のオーバーロードを用意しなくても汎用オーバーロードが使用できるようになった)
  - 条件付き`noexcept`指定を追加
- 以下のコンテナを`constexpr`に対応
  - `std::deque`
  - `std::forward_list`
  - `std::list`
  - `std::map` (ただし`node_handle::key()`を使用すると未定義動作)
  - `std::multimap` (ただし`node_handle::key()`を使用すると未定義動作)
  - `std::set`
  - `std::multiset`
  - `std::unordered_map` (ハッシュ関数のカスタム化が必要) (ただし`node_handle::key()`を使用すると未定義動作)
  - `std::unordered_multimap` (ハッシュ関数のカスタム化が必要) (ただし`node_handle::key()`を使用すると未定義動作)
  - `std::unordered_set` (ハッシュ関数のカスタム化が必要)
  - `std::unordered_multiset` (ハッシュ関数のカスタム化が必要)
  - `std::flat_map`
  - `std::flat_multimap`
  - `std::flat_set`
  - `std::flat_multiset`
  - `std::queue`
  - `std::priority_queue`
  - `std::stack`

### アルゴリズム

- `<algorithm>`と`<memory>`のアルゴリズムを並列実行に対応
- `<algorithm>`の以下のアルゴリズムを`constexpr`に対応
  - `std::stable_sort()` / `std::ranges::stable_sort()`
  - `std::stable_partition()` / `std::ranges::stable_partition()`
  - `std::inplace_merge()` / `std::ranges::inplace_merge()`
- `<memory>`の以下のアルゴリズムを`constexpr`に対応
  - `std::uninitialized_default_construct()` / `std::ranges::uninitialized_default_construct()`
  - `std::uninitialized_default_construct_n()` / `std::ranges::uninitialized_default_construct_n()`
  - `std::uninitialized_value_construct()` / `std::ranges::uninitialized_value_construct()`
  - `std::uninitialized_value_construct_n()` / `std::ranges::uninitialized_value_construct_n()`
  - `std::uninitialized_copy()` / `std::ranges::uninitialized_copy()`
  - `std::uninitialized_copy_n()` / `std::ranges::uninitialized_copy_n()`
  - `std::uninitialized_move()` / `std::ranges::uninitialized_move()`
  - `std::uninitialized_move_n()` / `std::ranges::uninitialized_move_n()`
  - `std::uninitialized_fill()` / `std::ranges::uninitialized_fill()`
  - `std::uninitialized_fill_n()` / `std::ranges::uninitialized_fill_n()`
- Rangeアルゴリズムが完全型を要求しないようにするため、`std::projected`の制約を緩和
- 以下のアルゴリズムに、値を波カッコ初期化で渡せるよう制約を追加
  - `std::erase()`
    - `std::basic_string`版`std::erase()`
    - `std::deque`版`std::erase()`
    - `std::forward_list`版`std::erase()`
    - `std::list`版`std::erase()`
    - `std::vector`版`std::erase()`
  - `std::find()`と`std::ranges::find()`
  - `std::ranges::find_last()`
  - `std::count()`と`std::ranges::count()`
  - `std::search_n()`と`std::ranges::search_n()`
  - `std::replace()`と`std::ranges::replace()`
  - `std::replace_if()`と`std::ranges::replace_if()`
  - `std::ranges::replace_copy()`
  - `std::replace_copy_if()`と`std::ranges::replace_copy_if()`
  - `std::fill()`と`std::ranges::fill()`
  - `std::fill_n()`と`std::ranges::fill_n()`
  - `std::remove()`と`std::ranges::remove()`
  - `std::remove_copy()`と`std::ranges::remove_copy()`
  - `std::lower_bound()`と`std::ranges::lower_bound()`
  - `std::upper_bound()`と`std::ranges::upper_bound()`
  - `std::equal_range()`と`std::ranges::equal_range()`
  - `std::binary_search()`と`std::ranges::binary_search()`
  - `std::ranges::fold_left()`
  - `std::ranges::fold_right()`
  - `std::ranges::contains()`
  - `std::uninitialized_fill()`と`std::ranges::uninitialized_fill()`
  - `std::uninitialized_fill_n()`と`std::ranges::uninitialized_fill_n()`

### 関数オブジェクト

- 所有権を保持しない`std::function`として、`<functional>`に`std::function_ref`クラスを追加
- `std::move_only_function`のコピー可能版として、`<functional>`に`std::copyable_function`クラスを追加
- `std::bind_front()`と`std::bind_back()`に、非型テンプレート引数として関数を指定するオーバーロードを追加
  - 関連して、非型テンプレート引数の関数オブジェクトを反転させられるよう、`not_fn()`に非型テンプレート引数版のオーバーロードを追加
- `std::reference_wrapper`に、比較演算子`==`と`<=>`を追加

### 文字列

- `<charconv>`の変換結果`std::to_chars_result`と`std::from_chars_result`に、変換が正しく完了したかを判定する`operator bool`を追加
- `std::to_string()`の仕様が`std::sprintf()`で説明されていたが、`std::format()`で定義するよう仕様を変更
- `std::basic_istringstream`および`std::basic_ostringstream`のコンストラクタおよび`str()`メンバ関数に、`std::basic_string_view`を受け取るオーバーロードを追加
- `std::format()`に、以下の改善を導入
  - ポインタ出力のサポートを追加
  - 幅と精度を動的に指定した場合でも型の検証がコンパイル時に行われるよう仕様を見直し
  - コンパイル時の書式文字列だけでなく、実行時の書式文字列を渡せるよう仕様修正
  - 非ロケール版を`constexpr`に対応
- `std::to_string()`と`std::to_wstring()`の整数オーバーロードが`constexpr`に対応
- `std::basic_string`クラスと`std::basic_string_view`クラスに、部分文字列を`std::basic_string_view`として取得するメンバ関数`subview()`を追加
- `std::basic_string`と`std::basic_string_view`を`std::basic_string`として連結させる`operator+`を追加

### ファイル

- ファイルのネイティブハンドルを取得できるよう、`std::basic_filebuf`、`std::basic_ifstream`、`std::basic_ofstream`、`std::basic_fstream`クラスに、以下のメンバを追加
  - `native_handle_type`型
  - `native_handle()`
- `std::filesystem::path`クラスに、文字列フォーマットのサポートを追加
- `std::filesystem::path`クラスに、出力用の文字列を取得するための、以下のメンバ関数を追加
  - `display_string()`
  - `system_encoded_string()`
  - `generic_display_string()`
  - `generic_system_encoded_string()`

### 入出力

- `std::print()`と`std::println()`に、ロックを取得せず高速に書き出す最適化を許可
- `std::println()`に、改行のみを出力するオーバーロードを追加
- `std::print()`と`std::println()`をより高速にできる最適化が可能か判定する`std::enable_nonlocking_formatter_optimization`を追加
- `std::basic_istream::ignore()`メンバ関数に、区切り文字として`char`型をとるオーバーロードを追加

### 並行・並列・非同期処理

- `<execution>`に汎用的な非同期実行を管理するフレームワークを追加
- `std::atomic`オブジェクトに対する2つの値の最大値・最小値を取得する関数として、以下を追加
  - メンバ関数
    - `fetch_max()`
    - `fetch_min()`
    - `fetch_fmaximum()` (浮動小数点数用)
    - `fetch_fminimum()` (浮動小数点数用)
    - `fetch_fmaximum_num()` (浮動小数点数用)
    - `fetch_fminimum_num()` (浮動小数点数用)
  - 非メンバ関数として
    - `std::atomic_fetch_max()`
    - `std::atomic_fetch_max_explicit()`
    - `std::atomic_fetch_min()`
    - `std::atomic_fetch_min_explicit()`
- `std::atomic`クラスと`std::atomic_ref`クラスに、現在の値を読み込まず (fetchせず) に加算などをする高速な縮約用の操作として、以下を追加
  - メンバ関数
    - `store_add()`
    - `store_sub()`
    - `store_and()`
    - `store_or()`
    - `store_xor()`
    - `store_max()`
    - `store_min()`
    - `store_fmaximum()` (浮動小数点数用)
    - `store_fminimum()` (浮動小数点数用)
    - `store_fmaximum_num()` (浮動小数点数用)
    - `store_fminimum_num()` (浮動小数点数用)
  - 非メンバ関数
    - `std::atomic_store_add()`
    - `std::atomic_store_add_explicit()`
    - `std::atomic_store_sub()`
    - `std::atomic_store_sub_explicit()`
    - `std::atomic_store_and()`
    - `std::atomic_store_and_explicit()`
    - `std::atomic_store_or()`
    - `std::atomic_store_or_explicit()`
    - `std::atomic_store_xor()`
    - `std::atomic_store_xor_explicit()`
    - `std::atomic_store_max()`
    - `std::atomic_store_max_explicit()`
    - `std::atomic_store_min()`
    - `std::atomic_store_min_explicit()`
- `std::atomic_ref`クラスに、参照するオブジェクトのアドレスを取得する`address()`メンバ関数を追加
- `std::atomic`クラスのテンプレートパラメータとしてCV修飾された型を禁止
- `std::atomic_ref`クラスのテンプレートパラメータとして、CV修飾された型を受け取れるようにした (内部でCV修飾が外される)
- `<atomic>`ライブラリのアトミック操作を`constexpr`対応

### スマートポインタ・メモリ関連

- 動的確保したオブジェクトに値の意味論をもたせてディープコピーさせるユーティリティクラスとして、`<memory>`に`std::indirect`クラスと`std::polymorphic`クラスを追加
- `std::weak_ptr`を非順序連想コンテナのキーとして使用できるよう、`<memory>`に所有権ベースのハッシュ値を取得する関数オブジェクト`std::owner_hash`、および所有権ベースの等値比較を行う関数オブジェクト`std::owner_equal`を追加
  - 関連して、`std::shared_ptr`クラスと`std::weak_ptr`クラスのメンバ関数として、`owner_hash()`と`owner_equal()`を追加
- `std::shared_ptr`クラスとその関連機能を`constexpr`対応

### 日付・時間

- `<chrono>`の以下のクラスに、ハッシュ値サポートとして`std::hash`の特殊化を追加
  - `std::chrono::duration`
  - `std::chrono::time_point`
  - `std::chrono::day`
  - `std::chrono::month`
  - `std::chrono::year`
  - `std::chrono::weekday`
  - `std::chrono::weekday_indexed`
  - `std::chrono::weekday_last`
  - `std::chrono::month_day`
  - `std::chrono::month_day_last`
  - `std::chrono::month_weekday`
  - `std::chrono::month_weekday_last`
  - `std::chrono::year_month`
  - `std::chrono::year_month_day`
  - `std::chrono::year_month_day_last`
  - `std::chrono::year_month_weekday`
  - `std::chrono::year_month_weekday_last`
  - `std::chrono::zoned_time`
  - `std::chrono::leap_second`

### 数値

- `<cmath>`に、浮動小数点数の最大値・最小値を求める以下の関数を追加
  - `std::fmaximum()` (-0.0と+0.0では+0.0を返し、NaNと数値ではNaNを返す)
  - `std::fmaximum_num()` (-0.0と+0.0では+0.0を返し、NaNと数値では数値を返す)
  - `std::fminimum()` (-0.0と+0.0では-0.0を返し、NaNと数値ではNaNを返す)
  - `std::fminimum_num()` (-0.0と-0.0では+0.0を返し、NaNと数値では数値を返す)
- `<numeric>`に、飽和演算 (Saturation Arithmetic) として、型の表現可能な範囲で演算を行う以下の関数を追加
  - `std::saturating_add()`
  - `std::saturating_sub()`
  - `std::saturating_mul()`
  - `std::saturating_div()`
  - `std::saturating_cast()`
- `std::complex`を構造化束縛や、将来のパターンマッチで使用できるようタプルインタフェースの特殊化を追加
- `<random>`の範囲`[0, 1)`の乱数を生成する`std::generate_canonical()`を、望ましい統計的性質を保証するようアルゴリズムと制約を変更
- `<random>`に、乱数列を生成する`std::ranges::generate_random()`関数を追加
- `<random>`に、乱数生成器は並列シミュレーションに効果的なカウンターベースのPhilox乱数生成器として、`std::philox_engine`クラス、およびその別名である`std::philox4x32`と`std::philox4x64`を追加
- `<random>`の乱数生成器に`signed char`と`unsigned char`のサポートを追加
- `<cmath>`の以下の関数を、`constexpr`に対応 (特殊関数と、グローバルの丸めモードに依存する丸め関数以外の全て)
  - `std::cos()`
  - `std::sin()`
  - `std::tan()`
  - `std::cosh()`
  - `std::sinh()`
  - `std::tanh()`
  - `std::acos()`
  - `std::asin()`
  - `std::atan()`
  - `std::atan2()`
  - `std::acosh()`
  - `std::asinh()`
  - `std::atanh()`
  - `std::exp()`
  - `std::exp2()`
  - `std::expm1()`
  - `std::log()`
  - `std::log10()`
  - `std::log1p()`
  - `std::log2()`
  - `std::pow()`
  - `std::sqrt()`
  - `std::cbrt()`
  - `std::hypot()`
  - `std::erf()`
  - `std::erfc()`
  - `std::lgamma()`
  - `std::tgamma()`
- `<complex>`の以下の関数を、`constexpr`に対応 (すべて)
  - `std::abs()`
  - `std::arg()`
  - `std::proj()`
  - `std::polar()`
  - `std::cos()`
  - `std::sin()`
  - `std::tan()`
  - `std::cosh()`
  - `std::sinh()`
  - `std::tanh()`
  - `std::acos()`
  - `std::asin()`
  - `std::atan()`
  - `std::acosh()`
  - `std::asinh()`
  - `std::atanh()`
  - `std::exp()`
  - `std::log()`
  - `std::log10()`
  - `std::pow()`
  - `std::sqrt()`
  - `std::norm()` (算術型オーバーロード)
  - `std::conj()` (算術型オーバーロード)
  - `std::imag()` (算術型オーバーロード)
  - `std::real()` (算術型オーバーロード)

### ユーティリティ

- `std::variant`クラスに、メンバ関数版の`visit()`を追加
- `std::monostate`を`<variant>`から`<utility>`に移動
- `std::optional`クラスに、0もしくは1要素のRangeとして扱えるようにするための拡張として、イテレータインタフェースを追加
  - `iterator`型
  - `const_iterator`型
  - `begin()`メンバ関数
  - `end()`メンバ関数
- `std::optional`に、参照を保持するための`T&`の部分特殊化を追加
- `std::apply`の戻り値型推論をやめて、戻り値型用の`std::apply_result`クラスを追加し、関連する以下の機能を追加
  - `std::is_applicable`型特性
  - `std::is_nothrow_applicable`型特性
- `std::ignore`をファーストクラス・オブジェクトとして型を詳細に定義
- `std::bitset`に、`std::basic_string_view`を受け取るコンストラクタを追加
- `<ratio>`に、新たなSI接頭辞として、以下を追加
  - `ronna` (1027)
  - `ronto` (10−27)
  - `quetta` (1030)
  - `quecto` (10−30)
- 定数式での例外送出が許可されることにともない、以下を`constexpr`化
  - `<exception>`ヘッダの以下の機能
    - `std::exception`クラスの全メンバ関数
    - `std::bad_exception`クラスの`what()`メンバ関数
    - `std::rethrow_exception()`関数
    - `std::make_exception_ptr()`関数
  - `<new>`ヘッダの以下の機能
    - `std::bad_alloc`クラスの`what()`メンバ関数
    - `std::bad_array_new_length`クラスの`what()`メンバ関数
  - `<typeinfo>`ヘッダの以下の機能
    - `std::bad_cast`クラスの`what()`メンバ関数
    - `std::bad_typeid`クラスの`what()`メンバ関数
  - `<stdexcept>`ヘッダの以下の機能
    - `std::domain_error`
    - `std::invalid_argument`
    - `std::length_error`
    - `std::logic_error`
    - `std::out_of_range`
    - `std::runtime_error`
    - `std::range_error`
    - `std::overflow_error`
    - `std::underflow_error`
  - `<expected>`ヘッダの以下の機能
    - `std::bad_expected_access`
  - `<optional>`ヘッダの以下の機能
    - `std::bad_optional_access`
  - `<variant>`ヘッダの以下の機能
    - `std::bad_variant_access`
  - `<format>`ヘッダの以下の機能
    - `std::format_error`
- `<memory>`に、ポインタのアライメントを判定する`std::is_sufficiently_aligned()`関数を追加。
- `<utility>`に、タイムトラベル最適化を抑止するための観測可能ポイントとして`std::observable_checkpoint()`を追加
- `std::exception_ptr`を指定した例外型にキャストする`std::exception_ptr_cast()`関数を追加
- `<compare>`に、型の順序を取得する`std::type_order`クラスを追加
- `<utility>`に、定数を型として包むことで、関数の引数として渡しても定数式として扱えるようにする定数ラッパー`std::constant_wrapper`クラスと、それを簡潔に生成する変数テンプレート`std::cw`を追加

### デバッグ

- `assert`マクロの引数としてカンマを含む式を指定できるよう、可変引数化

### 型特性

- `<type_traits>`に、共用体の指定されたメンバがアクティブかを定数式で判定するための関数として`std::is_within_lifetime()`を追加
- `<type_traits>`に、仮想継承の関係を判定する`std::is_virtual_base_of`を追加
- `std::integer_sequence`クラスを構造化束縛とtemplate for文で使用できるようにするため、タプルインタフェースの特殊化を追加

### 制約

- 間接実行に関連する制約から、共通参照の要件を削除
  - `std::indirectly_unary_invocable`
  - `std::indirectly_regular_unary_invocable`
  - `std::indirect_unary_predicate`
  - `std::indirect_binary_predicate`
  - `std::indirect_equivalence_relation`
  - `std::indirect_strict_weak_order`

### 機能の非推奨化

- `<type_traits>`の`std::is_trivial`を非推奨化
  - これは`std::is_trivially_copyable`と`std::is_trivially_default_constructible`の2つが合わさったものであるが、それらは異なる状況で必要になるものであった
- `std::memory_order::consume`と、それに関連して`std::kill_dependency()`を非推奨化し、`[[carries_dependency]]`属性を削除
- `std::filesystem::path`クラスの、以下の非テンプレート版メンバ関数を非推奨化
  - `string()`
  - `generic_string()`
  - これらはOS依存のパス名エンコーディングへ変換するため、iostream・`std::format()`・`std::print()`を含むほぼすべての標準のテキスト処理・入出力機能と互換性がなく、文字化けやデータ損失の原因になりやすい
  - レガシーなシステムAPIにパスを渡す用途では、システム依存エンコーディングへの変換であることを明確にした`system_encoded_string()`・`generic_system_encoded_string()`を使用する
  - 表示・フォーマットの用途では、`display_string()`・`generic_display_string()`、もしくは`std::format()`・`std::print()`を使用する

### 非推奨の取り消し

- `std::polymorphic_allocator::destroy()`の非推奨を取り消し

### 機能の削除

- C++98から非推奨となっていた`<strstream>`ライブラリを削除
- C++17から非推奨となっていたUnicode変換ライブラリ`<codecvt>`と、`std::wstring_convert`クラス、`std::wbuffer_convert`クラスを削除
- C++20から非推奨となっていた、`std::basic_string::reserve()`のパラメータなしのオーバーロードを削除
- C++20から非推奨となっていた`std::shared_ptr`に対する、以下の古いアトミック操作関数のオーバーロードを削除
  - `std::atomic_is_lock_free`
  - `std::atomic_load`
  - `std::atomic_load_explicit`
  - `std::atomic_store`
  - `std::atomic_store_explicit`
  - `std::atomic_exchange`
  - `std::atomic_exchange_explicit`
  - `std::atomic_compare_exchange_weak`
  - `std::atomic_compare_exchange_strong`
  - `std::atomic_compare_exchange_weak_explicit`
  - `std::atomic_compare_exchange_strong_explicit`
- C++23から非推奨となっていた、`std::allocator`のメンバ型`is_always_equal`を削除

## 取り決め

- C言語の参照をC17からC23に更新。これにともない、Cライブラリ由来のヘッダに以下の変更が入った
  - `<cstdlib>`: `free_sized()`・`free_aligned_sized()`・`memalignment()`・`strfromf()`・`strfromd()`・`strfroml()`を追加。`bsearch()`に`const`版オーバーロードを追加。`realloc()`にサイズ`0`を渡した場合がエラー性動作となった
  - `<ctime>`: `timespec_getres()`・`timegm()`・`gmtime_r()`・`localtime_r()`と、`TIME_MONOTONIC`・`TIME_ACTIVE`・`TIME_THREAD_ACTIVE`・`__STDC_VERSION_TIME_H__`を追加。`asctime()`・`ctime()`を非推奨化
  - `<cmath>`: `nextup()`・`nextdown()`を追加
  - `<cstdio>`: `_PRINTF_NAN_LEN_MAX`・`__STDC_VERSION_STDIO_H__`を追加
  - `<cinttypes>`: 2進数用の書式指定マクロ (`PRIb` N・`SCNb` N等) と`__STDC_VERSION_INTTYPES_H__`を追加
  - `<cfloat>`: `INFINITY`・`NAN`・`FLT_SNAN`・`DBL_SNAN`・`LDBL_SNAN`・`__STDC_VERSION_FLOAT_H__`を追加。`DECIMAL_DIG`を非推奨化し、`FLT_HAS_SUBNORM`・`DBL_HAS_SUBNORM`・`LDBL_HAS_SUBNORM`を廃止予定 (obsolescent) とした
  - `<climits>`: 各整数型の幅 (ビット数) を表す`BOOL_WIDTH`等のマクロを追加
  - `<cstdint>`: 各整数型の幅 (ビット数) を表す`INT8_WIDTH`等のマクロと、`__STDC_VERSION_STDINT_H__`を追加
  - `<cstring>`: `memccpy()`・`strdup()`・`strndup()`・`memset_explicit()`を追加
  - `<cuchar>`: `mbrtoc8()`・`c8rtomb()`・`__STDC_VERSION_UCHAR_H__`を追加
  - `<cstddef>`: `unreachable`マクロおよび`__STDC_VERSION_STDDEF_H__`は定義しないことを明記