C++29とは、2029年中に改訂される予定の、C++バージョンの通称である。
このバージョンは、策定中のためC++2dと呼ばれることがある。「(2020年代の4つ目のバージョンが) 202d年にリリースされる」という伏せ字として「d」が使われているが、3年周期に次のバージョンが策定されることが決まっているため、伏せ字になっている年数がずれることはない。
| 言語機能 | 説明 |
|---|---|
| 浮動小数点演算のオーバーフローと無限大・NaNの扱いを明確化 | 無限大を表現できる浮動小数点型では、オーバーフローは未定義動作ではなく無限大を生成すると規定する。オーバーフローやNaNを新たに生成する演算は定数式にならず、無限大・NaNの伝播は定数式として扱える |
| 言語機能 | 説明 |
|---|---|
| 名前付きユニバーサルキャラクタ名で使用できる別名を拡張 | \N{…}に指定できる文字名の別名の分類制限を撤廃し、\N{NBSP}のような略称 (abbreviation) なども使用できるようにする |
| 言語機能 | 説明 |
|---|---|
コルーチンのpromise型でreturn_valueとreturn_voidの両方の宣言を許可 |
1つのコルーチン内に、値をともなうco_return文とともなわないco_return文を混在させられるようにする |
| 言語機能 | 説明 |
|---|---|
| ラムダ式のキャプチャが書かれた順に初期化されることを保証 | 明示的なキャプチャに対応するクロージャ型のメンバ変数が、キャプチャを書いた順に宣言・初期化され、逆順に破棄されることを保証する |
| 例外を送出しうる例外指定をもつ解放関数を不適格とする | operator deleteなどの解放関数に、noexcept(false)のような例外を送出しうる例外指定を付けることを不適格とする。解放関数からの例外送出による未定義動作へ到達する経路を、宣言の時点で排除する |
| 言語機能 | 説明 |
|---|---|
| 基底クラスのメンバ変数に対する指示付き初期化を許可 | B{.a=1, .b=2}のように、集成体の指示付き初期化で基底クラスのメンバ変数を直接指定できるようにする。基底クラス部分を初期化する指示なし初期化子との混在も許可する |
| 後置インクリメント・デクリメント演算のdefault定義 | 後置++/--を= defaultで定義(前置版から自動生成)できるようにする |
| default定義できる代入演算子のシグネチャを制限 | A& operator=(const A&) && = defaultのような右辺値修飾やCV修飾された代入演算子のdefault定義を不適格とする。これらの代入演算子を自分で定義することは引き続きできる |
| 仮想関数への事前条件・事後条件の指定を許可 | C++26で不適格とされていた、仮想関数への事前条件pre・事後条件postの指定を許可する。仮想関数呼び出しでは、静的に選択された関数と実際に呼び出される関数の両方のアサーションが評価される |
| 言語機能 | 説明 |
|---|---|
| extern "C"の中でのテンプレートの宣言を許可 | テンプレートがC言語リンケージを持つことを禁止する規定を削除し、extern "C"の中でテンプレートを宣言できるようにする。C言語リンケージの関数ポインタ型を、テンプレートパラメータに依存する形で書けるようになる |
requires式の複合要件で条件付きnoexcept指定を許可 |
requires式の複合要件で、{ 式 } noexcept(定数式)形式の条件付きnoexcept指定を書けるようにする |
| テンプレートテンプレートパラメータのパックへのインデックスアクセスを許可 | テンプレートテンプレートパラメータのパックにTT...[N]形式でインデックスアクセスできるようにする |
| 言語機能 | 説明 |
|---|---|
| consteval-only型の規則をconsteval-only値の規則へ置き換え | リフレクションが実行時へ漏れることを防ぐ規則を、型ベースから値ベースへ変更する |
| 言語機能 | 説明 |
|---|---|
| 整数からポインタへの変換とポインタの由来の扱いを規定 | 整数からポインタへの変換では、その整数へ変換できるポインタ値のうち、プログラムの動作が定義される値が選択されると規定する |
| 無効なポインタ値の読み書き・コピーを定義された動作とする | 無効なポインタ値の使用のうち、間接参照は未定義動作、比較などは処理系定義のままとし、読み込み・書き込み・コピーなどそれ以外の操作を定義された動作とする |
| アトミック操作とvolatileアクセスでの無効なポインタ値の扱いを規定 | アトミックポインタの操作やvolatileアクセスの結果が無効なポインタ値となる場合、整数への往復変換を経た有効なポインタ値になると規定する。解放と並行してポインタを扱うロックフリーアルゴリズムを定義された動作にする |
| 言語機能 | 説明 |
|---|---|
#embedにoffsetパラメータを追加 |
#embedのパラメータとして、リソースの先頭から指定した要素数を読み飛ばすoffsetを追加する |
| 言語機能 | 説明 |
|---|---|
| 未定義動作とIFNDRの一覧を規格の付録に追加 | コア言語で明示的に規定されているすべての未定義動作と、診断不要で不適格 (IFNDR) となるすべての規則を、安定した名前・説明・コード例付きで列挙する参考情報の付録を追加する |
| 言語機能 | 説明 |
|---|---|
| 数学互換記法の文字を識別子として許可 | Unicodeの新しい勧告に従い、∇fやx²のような数学記法の文字(ID_Compat_Math_Start/Continueプロパティを持つ文字)を識別子に使用できるようにする |
- 任意定義だった
std::intptr_t/std::uintptr_t型を必須定義とする
std::format()関数での浮動小数点数の規定の出力形式を修正- これまでの既定書式が最短文字数を基準としていたため、
100000.0→"1e+05"なのに120000.0→"120000"と一貫していない出力になっていたのを修正 - また、大きな値で
1234567890123456774144のような無意味な桁(garbage digits)がでる問題について、固定表記か指数表記かの切り替え基準を「値の大きさ(指数範囲[10⁻⁴, 10ⁿ))」に変更して修正した
- これまでの既定書式が最短文字数を基準としていたため、
<bit>に、以下のビット操作関数を追加- ビット列の並びを反転する
std::bit_reverse()関数 - 指定した下位ビットパターンを繰り返す
std::bit_repeat()関数 - 指定したマスクで立っている一のビットを下位に詰める
std::bit_compress()関数 - 下位ビットを指定したマスクが立っている位置へ展開する
std::bit_expand()関数 - 未定義動作にならないビットシフト
std::shl()関数とstd::shr()関数
- ビット列の並びを反転する
std::map/std::unordered_map/std::flat_mapクラスに、std::optional<要素への参照>を返す検索メンバ関数lookup()を追加std::ranges::view_interfaceクラスに、境界チェック付きでランダムアクセスをするメンバ関数at()を追加std::mdspanクラス向けのアルゴリズムとしてstd::copy()とstd::fill()を追加
<memory>ヘッダに、ポインタのタグ付けを行うstd::pointer_tag_pairクラスとその関連機能を追加
std::error_codeクラスのオブジェクトを文字列化する際の、カテゴリ名のエンコーディングの問題を修正し、std::format()用のformatter特殊化を追加
std::threadクラスとstd::jthreadクラスに、スレッド名とスタックサイズを設定する機能を追加- SIMDデータ用に連番を生成する
std::simd::iota変数テンプレートを追加 <bit>ヘッダと同様に、<simd>ヘッダにも、以下のビット操作関数を追加- ビット列の並びを反転する
std::simd::bit_reverse()関数 - 指定した下位ビットパターンを繰り返す
std::simd::bit_repeat()関数 - 指定したマスクで立っている一のビットを下位に詰める
std::simd::bit_compress()関数 - 下位ビットを指定したマスクが立っている位置へ展開する
std::simd::bit_expand()関数 - 未定義動作にならないビットシフト
std::simd::shl()関数とstd::simd::shr()関数
- ビット列の並びを反転する
<hazard_pointer>に、複数のハザードポインタをまとめて構築・破棄するstd::make_hazard_pointer_batch()関数とstd::clear_hazard_pointer_batch()関数を追加
<iostream>において、signed char/unsigned charの入出力を非推奨化。std::int8_t/std::uint8_tの別名として扱われるこれらの型の入出力で、整数型であることを期待して予期せぬ結果を招く可能性があった