概要
C++26とは、2026年中に改訂される予定の、C++バージョンの通称である。
このバージョンは、策定中のためC++2cと呼ばれることがある。「(2020年代の3つ目のバージョンが) 202c年にリリースされる」という伏せ字として「c」が使われているが、3年周期に次のバージョンが策定されることが決まっているため、伏せ字になっている年数がずれることはない。
言語機能
変数
言語機能 | 説明 |
---|---|
std::initializer_list の配列を静的ストレージに配置する |
std::vector v = {1, 2, 3}; のような初期化で初期化子リストを静的ストレージに配置することで無駄なコピーをなくす |
宣言のみで使用しない変数の名前として_ をサポート |
変数名_ は暗黙で[[maybe_unused]] が指定される |
非推奨となっていた列挙型の算術変換を削除 | C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除 |
不完全型へのポインタに対するdelete を不適格とする |
未定義動作を引き起こす操作をコンパイルエラーとする |
返却された左辺値から暗黙変換された一時オブジェクトが参照に束縛されることを禁止する | 寿命切れの変数によって引き起こされるバグを防止する |
要素数不明の配列を集成体初期化する規則を明確化 | 配列要素の集成体初期化で{} が省略された場合の矛盾していた規定を修正 |
未初期化変数の読み取りをエラー性動作とする | 初期化されていない自動変数の読み取りの安全性を規定する |
文字列
言語機能 | 説明 |
---|---|
文字列リテラルの文字エンコーディング失敗を不適格とする | 文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする |
コンパイル時にのみ使用される文字列の扱いを明確化 | static_assert や[[deprecated]] などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定 |
分岐・ループ
言語機能 | 説明 |
---|---|
条件式での構造化束縛の使用を許可 | 式全体をbool 値に変換できる場合に条件式で構造化束縛を使用できることとする |
自明な無限ループは未定義動作ではないと規定 | 並行プログラムの進行保証などを考慮して無限ループを未定義動作ではないものとする |
関数
言語機能 | 説明 |
---|---|
関数宣言を削除する理由を指定できるようにする | f() = delete("reason"); |
属性
言語機能 | 説明 |
---|---|
属性の無視性を見直し | 構文として適格な属性のみを無視できるようにし、そうでない属性の使用を不適格とする |
構造化束縛への属性を許可 | auto [a, b [[maybe_unused]], c] = f(); のように構造化束縛の要素に対して属性を付加できるようにする |
テンプレート
言語機能 | 説明 |
---|---|
パラメータパックへのインデックスアクセスを許可 | 可変引数テンプレートのパラメータパックに添字アクセスできるようにする |
制約式内での畳み込み式の順序付け | 畳み込み式では全体ではなく個別の制約を原子制約式として扱う |
可変引数テンプレートでfriend 宣言をできるようにする |
クラステンプレートの可変引数テンプレートでまとめてfriend 宣言できるようにする |
定数式
言語機能 | 説明 |
---|---|
定数式でのvoid* からポインタ型へのキャストを許可 |
型消去のためにvoid* からポインタ型へのキャストを許可する |
static_assert の診断メッセージにユーザーが生成した文字列の指定を許可 |
constexpr なS.size() とS.data() メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする |
constexpr 配置new |
定数式の文脈での配置new を許可 |
ソースコード
言語機能 | 説明 |
---|---|
基本文字集合に@、$、`を追加 | C言語との互換性のためにこれらの文字を基本文字集合に追加 |
モジュール
言語機能 | 説明 |
---|---|
モジュール宣言でのモジュール名のマクロ展開を禁止する | export module MACRO_NAME; を禁止 |
ライブラリ更新の概要
新ライブラリ
- 文字列エンコーディングを識別するライブラリとして、
<text_encoding>
を追加 - 並行処理におけるデータの参照・更新を行うRCU (Read Copy Update) のライブラリとして、
<rcu>
を追加 - 並行処理において参照中のデータが更新されないよう保護するハザードポインタのライブラリとして、
<hazard_pointer>
を追加 - デバッグサポートのライブラリとして
<debugging>
を追加 - 線形代数ライブラリとして
<linalg>
を追加 - コンパイル時に容量を固定する可変長配列クラスのライブラリとして
<inplace_vector>
を追加
コンテナ
std::mdspan
から部分ビューを取り出すstd::submdspan()
を追加std::mdspan
に対するstd::dextents
指定の冗長さを解決するstd::dims
を追加std::mdspan
のレイアウトとして、std::layout_left_padded
とstd::layout_right_padded
を追加std::span
に、以下を追加std::initializer_list
をとるコンストラクタ- インデックスアクセスのための
at()
メンバ関数
- 連想コンテナの以下のメンバ関数に、一時オブジェクトが生成されるコストを抑える拡張を追加
std::span
とstd::mdspan
の推論補助を改善std::views::concat
を追加
アルゴリズム
- 以下のアルゴリズムを
constexpr
に対応 - 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()
に、非型テンプレート引数として関数を指定するオーバーロードを追加- 関連して、非型テンプレート引数の関数オブジェクトを反転させられるよう、
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()
に、以下の改善を導入- ポインタ出力のサポートを追加
- 幅と精度を動的に指定した場合でも型の検証がコンパイル時に行われるよう仕様を見直し
- コンパイル時の書式文字列だけでなく、実行時の書式文字列を渡せるよう仕様修正
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::print()
とstd::println()
に、ロックを取得せず高速に書き出す最適化を許可std::println()
に、改行のみを出力するオーバーロードを追加std::print()
とstd::println()
をより高速にできる最適化が可能か判定するstd::enable_nonlocking_formatter_optimization
を追加
並行・並列処理
std::atomic
オブジェクトに対する2つの値の最大値・最小値を取得する関数として、メンバ関数fetch_max()
とfetch_min()
、非メンバ関数としてstd::atomic_fetch_max
、std::atomic_fetch_max_explicit
、std::atomic_fetch_min
、std::atomic_fetch_min_explicit
を追加
スマートポインタ
std::weak_ptr
を非順序連想コンテナのキーとして使用できるよう、<memory>
に所有権ベースのハッシュ値を取得する関数オブジェクトstd::owner_hash
、および所有権ベースの等値比較を行う関数オブジェクトstd::owner_equal
を追加- 関連して、
std::shared_ptr
クラスとstd::weak_ptr
クラスのメンバ関数として、owner_hash()
とowner_equal()
を追加
- 関連して、
日付・時間
<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
数値
<numeric>
に、飽和演算 (Saturation Arithmetic) として、型の表現可能な範囲で演算を行う以下の関数を追加<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::complex
を構造化束縛や、将来のパターンマッチで使用できるようタプルインタフェースの特殊化を追加<random>
の範囲[0, 1)
の乱数を生成するstd::generate_canonical()
を、望ましい統計的性質を保証するようアルゴリズムと制約を変更<random>
に、乱数列を生成するstd::ranges::generate_random()
関数を追加
ユーティリティ
std::variant
クラスに、メンバ関数版のvisit()
を追加std::optional
クラスに、0もしくは1要素のRangeとして扱えるようにするための拡張として、イテレータインタフェースを追加iterator
型const_iterator
型begin()
メンバ関数end()
メンバ関数
std::ignore
をファーストクラス・オブジェクトとして型を詳細に定義std::bitset
に、std::basic_string_view
を受け取るコンストラクタを追加<ratio>
に、新たなSI接頭辞として、以下を追加
デバッグ
assert
マクロの引数としてカンマを含む式を指定できるよう、可変引数化
型特性
<type_traits>
に、共用体のどのメンバがアクティブかを判定するための関数としてstd::is_within_lifetime()
を追加<type_traits>
に、仮想継承の関係を判定するstd::is_virtual_base_of
を追加
制約
- 間接実行に関連する制約から、共通参照の要件を削除
非推奨の取り消し
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
を削除