概要
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"); |
| 契約プログラミングをサポートする | 関数の事前条件、事後条件、不変条件を記述できるようにする |
クラス
| 言語機能 | 説明 |
|---|---|
| 共用体をトリビアルに未初期化できるようにする | constexprでのunion U { T storage[N]; };を許可し、未初期化にできるようにする |
| トリビアルな再配置 | ムーブ構築と破棄のためにビット単位のコピーとデストラクタ評価が必要になる型のオブジェクトを再配置するメカニズムを導入する |
属性
| 言語機能 | 説明 |
|---|---|
| 属性の無視性を見直し | 構文として適格な属性のみを無視できるようにし、そうでない属性の使用を不適格とする |
| 構造化束縛への属性を許可 | auto [a, b [[maybe_unused]], c] = f();のように構造化束縛の要素に対して属性を付加できるようにする |
テンプレート
| 言語機能 | 説明 |
|---|---|
| パラメータパックへのインデックスアクセスを許可 | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする |
| 制約式内での畳み込み式の順序付け | 畳み込み式では全体ではなく個別の制約を原子制約式として扱う |
可変引数テンプレートでfriend宣言をできるようにする |
クラステンプレートの可変引数テンプレートでまとめてfriend宣言できるようにする |
| コンセプトと変数テンプレートにテンプレートテンプレートパラメータのサポートを追加 | テンプレート引数をあとで指定するテンプレートテンプレートパラメータを、コンセプトと変数テンプレートでも使用できるようにする |
定数式
| 言語機能 | 説明 |
|---|---|
| 静的リフレクション | リフレクション演算子^^とstd::meta::info型によりコンパイル時にさまざまな情報を取得できる |
コンパイル時のタプルやリストを展開処理するtemplate for文 |
クラス・タプル・Range・パラメータパックなどを展開してすべての要素をコンパイル時の処理するtemplate for文を追加 |
定数式でのvoid*からポインタ型へのキャストを許可 |
型消去のためにvoid*からポインタ型へのキャストを許可する |
static_assertの診断メッセージにユーザーが生成した文字列の指定を許可 |
constexprなS.size()とS.data()メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする |
constexpr配置new |
定数式の文脈での配置newを許可 |
constexpr構造化束縛の許可と、constexpr参照の制限緩和 |
定数式に対する構造化束縛を許可し、関連してconstexpr参照の制限を緩和して自動変数も参照できるようにする |
| 定数評価での例外送出を許可 | 定数式の文脈での例外の送出と捕捉を許可 |
constexpr仮想継承を許可 |
定数式の文脈での仮想継承を許可 |
プリプロセッサ
| 言語機能 | 説明 |
|---|---|
ファイルを読み込む#embed命令を追加 |
バイナリファイルをインクルードするメカニズム。#includeとちがって読み出しサイズなどの柔軟な指定ができる |
| プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更 | プリプロセッサとレキサーの文脈での「未定義動作」用語を不適格 (診断不要) に変更 |
ソースコード
| 言語機能 | 説明 |
|---|---|
| 基本文字集合に@、$、`を追加 | C言語との互換性のためにこれらの文字を基本文字集合に追加 |
モジュール
| 言語機能 | 説明 |
|---|---|
| モジュール宣言でのモジュール名のマクロ展開を禁止する | export module MACRO_NAME;を禁止 |
main関数をグローバルモジュールに含められるようにする |
main関数にextern "C++"を指定できるようにすることで名前付きモジュールに含められるようにする |
機能の非推奨化
| 言語機能 | 説明 |
|---|---|
| 先行するカンマのない省略記号を非推奨化 | 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::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に、以下を追加std::initializer_listをとるコンストラクタ- インデックスアクセスのための
at()メンバ関数
- 連想コンテナの以下のメンバ関数に、一時オブジェクトが生成されるコストを抑える拡張を追加
std::spanとstd::mdspanの推論補助を改善std::views::concatを追加std::views::cache_latestを追加std::views::to_inputを追加。これはパフォーマンス向上のために、Rangeを入力Rangeかつ非common_range(イテレータと番兵の型を別する) に変換する- Range関係の、償却定数時間での要素追加を行う機能を追加
- 各viewクラスに
reserve_hint()メンバ関数を追加 std::ranges::reserve_hint()関数を追加std::ranges::approximately_sized_rangeコンセプトを追加
- 各viewクラスに
- インデックス列を生成する
std::views::indicesを追加 - 連続イテレータのコンセプト
contiguous_iteratorに、ポインタに変換できることを要件として追加 - 以下のコンテナを
constexprに対応std::dequestd::forward_liststd::liststd::map(ただしnode_handle::key()を使用すると未定義動作)std::multimap(ただしnode_handle::key()を使用すると未定義動作)std::setstd::multisetstd::unordered_map(ハッシュ関数のカスタム化が必要) (ただしnode_handle::key()を使用すると未定義動作)std::unordered_multimap(ハッシュ関数のカスタム化が必要) (ただしnode_handle::key()を使用すると未定義動作)std::unordered_set(ハッシュ関数のカスタム化が必要)std::unordered_multiset(ハッシュ関数のカスタム化が必要)std::flat_mapstd::flat_multimapstd::flat_setstd::flat_multisetstd::queuestd::priority_queuestd::stack
アルゴリズム
<algorithm>と<memory>のアルゴリズムを並列実行に対応<algorithm>の以下のアルゴリズムをconstexprに対応<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::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::functionとして、<functional>にstd::function_refクラスを追加 std::move_only_functionのコピー可能版として、<functional>にstd::copyable_functionクラスを追加std::bind_front()とstd::bind_back()に、非型テンプレート引数として関数を指定するオーバーロードを追加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()に、以下の改善を導入- ポインタ出力のサポートを追加
- 幅と精度を動的に指定した場合でも型の検証がコンパイル時に行われるよう仕様を見直し
- コンパイル時の書式文字列だけでなく、実行時の書式文字列を渡せるよう仕様修正
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クラスと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::durationstd::chrono::time_pointstd::chrono::daystd::chrono::monthstd::chrono::yearstd::chrono::weekdaystd::chrono::weekday_indexedstd::chrono::weekday_laststd::chrono::month_daystd::chrono::month_day_laststd::chrono::month_weekdaystd::chrono::month_weekday_laststd::chrono::year_monthstd::chrono::year_month_daystd::chrono::year_month_day_laststd::chrono::year_month_weekdaystd::chrono::year_month_weekday_laststd::chrono::zoned_timestd::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::complexを構造化束縛や、将来のパターンマッチで使用できるようタプルインタフェースの特殊化を追加<random>の範囲[0, 1)の乱数を生成するstd::generate_canonical()を、望ましい統計的性質を保証するようアルゴリズムと制約を変更<random>に、乱数列を生成するstd::ranges::generate_random()関数を追加<random>に、乱数生成器は並列シミュレーションに効果的なカウンターベースのPhilox乱数生成器として、std::philox_engineクラス、およびその別名であるstd::philox4x32とstd::philox4x64を追加<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として扱えるようにするための拡張として、イテレータインタフェースを追加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接頭辞として、以下を追加- 定数式での例外送出が許可されることにともない、以下を
constexpr化<exception>ヘッダの以下の機能std::exceptionクラスの全メンバ関数std::nested_exceptionクラスの全メンバ関数std::bad_exceptionクラスのwhat()メンバ関数std::uncaught_exceptions()関数std::current_exception()関数std::rethrow_exception()関数std::make_exception_ptr()関数std::throw_with_nested()関数std::rethrow_if_nested()関数
<new>ヘッダの以下の機能std::bad_allocクラスのwhat()メンバ関数std::bad_array_new_lengthクラスのwhat()メンバ関数
<typeinfo>ヘッダの以下の機能std::bad_castクラスのwhat()メンバ関数std::bad_typeidクラスのwhat()メンバ関数
<stdexcept>ヘッダの以下の機能<expected>ヘッダの以下の機能<optional>ヘッダの以下の機能<variant>ヘッダの以下の機能<format>ヘッダの以下の機能
<memory>に、ポインタのアライメントを判定するstd::is_sufficiently_aligned()関数を追加。<utility>に、タイムトラベル最適化を抑止するための観測可能ポイントとしてstd::observable_checkpoint()を追加std::exception_ptrを指定した例外型にキャストするstd::exception_ptr_cast()関数を追加<compare>に、型の順序を取得するstd::type_orderクラスを追加
デバッグ
assertマクロの引数としてカンマを含む式を指定できるよう、可変引数化
型特性
<type_traits>に、共用体の指定されたメンバがアクティブかを定数式で判定するための関数としてstd::is_within_lifetime()を追加<type_traits>に、仮想継承の関係を判定するstd::is_virtual_base_ofを追加<type_traits>に、std::integral_constantクラスを置き換える定数ラッパーとしてstd::constant_wrapperクラスを追加
制約
- 間接実行に関連する制約から、共通参照の要件を削除
機能の非推奨化
<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クラスの以下のメンバ関数を非推奨化
非推奨の取り消し
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_freestd::atomic_loadstd::atomic_load_explicitstd::atomic_storestd::atomic_store_explicitstd::atomic_exchangestd::atomic_exchange_explicitstd::atomic_compare_exchange_weakstd::atomic_compare_exchange_strongstd::atomic_compare_exchange_weak_explicitstd::atomic_compare_exchange_strong_explicit
- C++23から非推奨となっていた、
std::allocatorのメンバ型is_always_equalを削除
取り決め
- C言語の参照をC17からC23に更新