最終更新日時: 2026年03月06日 09時01分03秒 (JST)
teruyamato0731 が更新

履歴 編集

# 機能テストマクロ(C++20)

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

### 言語機能

マクロ名 | 値 | 機能
--- | --- | ---
`__cpp_aggregate_paren_init` | `201902L` | 丸カッコの値リストからの集成体初期化を許可
`__cpp_char8_t` | `201811L` | UTF-8エンコーディングされた文字の型として`char8_t`を追加
`__cpp_concepts` | `201907L` | コンセプト
`__cpp_conditional_explicit` | `201806L` | 関数を条件付きで`explicit`にする構文を追加
`__cpp_constexpr` | `201907L` `202002L` | 定数式からの仮想関数の呼び出しを許可 定数式での`dynamic_cast`、多態的な`typeid`を許可 constexpr関数内でのtry-catchブロックを許可 定数式内での共用体のアクティブメンバの変更を許可 constexpr関数内でのトリビアルなデフォルト初期化を許可 constexpr関数内で未評価のインラインアセンブリを許可することによる組み込み関数のconstexpr有効化
`__cpp_constexpr_dynamic_alloc` | `201907L` | 可変サイズをもつコンテナの`constexpr`化
`__cpp_constexpr_in_decltype` | `201711L` | 評価されない文脈での定数式評価によって特殊メンバ関数がインスタンス化されることを規定
`__cpp_consteval` | `201811L` | 常に定数式評価する`consteval`
`__cpp_constinit` | `201907L` | コンパイル時初期化を強制する`constinit`キーワードを追加
`__cpp_deduction_guides` | `201907L` | 集成体クラステンプレートのテンプレート引数推論 エイリアステンプレート経由でのクラステンプレートのテンプレート引数推論
`__cpp_designated_initializers` | `201707L` | 指示付き初期化
`__cpp_generic_lambdas` | `201707L` | ジェネリックラムダのテンプレート構文
`__cpp_impl_coroutine` | `201902L` | コルーチン
`__cpp_impl_destroying_delete` | `201806L` | 可変長データを扱うクラスの効率的な`delete`
`__cpp_impl_three_way_comparison` | `201907L` | `<=>`/`==`による比較演算子の自動定義
`__cpp_init_captures` | `201803L` | ラムダ式の初期化キャプチャでのパック展開を許可
`__cpp_modules` | `201907L` | モジュール
`__cpp_nontype_template_args` | `201911L` | 非型テンプレートパラメータとしてクラス型を許可する
`__cpp_using_enum` | `201907L` | スコープ付き列挙型のusing宣言

### ライブラリ

ライブラリの機能テストマクロは全て`<version>`でも提供される。

マクロ名 | 値 | 機能 | ヘッダ
--- | --- | --- | ---
`__cpp_lib_array_constexpr` | `201803L` `201806L` `201811L` | `std::array`の完全`constexpr`対応 | `<iterator>` `<array>`
`__cpp_lib_assume_aligned` | `201811L` | `std::assume_aligned()` | `<memory>`
`__cpp_lib_atomic_flag_test` | `201907L` | `std::atomic_flag::test()` | `<atomic>`
`__cpp_lib_atomic_float` | `201711L` | `std::atomic`の浮動小数点数型に対する特殊化 | `<atomic>`
`__cpp_lib_atomic_lock_free_type_aliases` | `201907L` | `atomic_signed_lock_free/atomic_unsigned_lock_free` | `<atomic>`
`__cpp_lib_atomic_ref` | `201806L` | `std::atomic_ref` | `<atomic>`
`__cpp_lib_atomic_shared_ptr` | `201711L` | `std::atomic`の`std::shared_ptr/std::weak_ptr`に対する特殊化 | `<memory>`
`__cpp_lib_atomic_value_initialization` | `201911L` | `std::atomic_flag`の値初期化 | `<atomic>` `<memory>`
`__cpp_lib_atomic_wait` | `201907L` | `std::atomic::wait()`、`std::atomic::notify_one()`、`std::atomic::notify_all()` | `<atomic>`
`__cpp_lib_barrier` | `201907L` | `<barrier>`の追加 | `<barrier>`
`__cpp_lib_bind_front` | `201811L` `201907L` | `std::bind_front()` | `<functional>`
`__cpp_lib_bit_cast` | `201806L` | `std::bit_cast()` | `<bit>`
`__cpp_lib_bitops` | `201907L` | `<bit>`の追加 | `<bit>`
`__cpp_lib_bounded_array_traits` | `201902L` | `std::is_bounded_array`、`std::is_unbounded_array` | `<type_traits>`
`__cpp_lib_char8_t` | `201811L` `201907L` | `char8_t`に対する特殊化の追加 | `<atomic>` `<filesystem>` `<istream>` `<limits>` `<locale>` `<ostream>` `<string>` `<string_view>`
`__cpp_lib_chrono` | `201907L` | カレンダーとタイムゾーン | `<chrono>`
`__cpp_lib_concepts` | `202002L` | `<concepts>`の追加 | `<concepts>`
`__cpp_lib_constexpr_algorithms` | `201806L` | 多くのアルゴリズムに`constexpr`を追加 | `<algorithm>`
`__cpp_lib_constexpr_complex` | `201711L` | `std::complex`の`constexpr`対応 | `<complex>`
`__cpp_lib_constexpr_dynamic_alloc` | `201907L` | `std::destroy_at`ファミリと`std::allocator`/`std::allocator_traits`の`constexpr`対応 `std::construct_at` | `<memory>`
`__cpp_lib_constexpr_functional` | `201907L` | `std::invoke`、`std::reference_wrapper`、`std::not_fn`、`std::bind_front`、`std::bind`、`std::mem_fn`の`constexpr`対応 | `<functional>`
`__cpp_lib_constexpr_iterator` | `201811L` | `back_insert_iterator`、`front_insert_iterator`、`insert_iterator`の`constexpr`対応 | `<iterator>`
`__cpp_lib_constexpr_memory` | `201811L` | `std::pointer_traits`の`constexpr`対応 | `<memory>`
`__cpp_lib_constexpr_numeric` | `201911L` | `<numeric>`の数値アルゴリズムの`constexpr`対応 | `<numeric>`
`__cpp_lib_constexpr_string` | `201907L` | `std::string`の`constexpr`対応 | `<string>`
`__cpp_lib_constexpr_string_view` | `201811L` | `std::string_view::copy`の`constexpr`対応 | `<string_view>`
`__cpp_lib_constexpr_tuple` | `201811L` | `std::tuple`の`constexpr`追加対応（一部のコンストラクタと代入演算子） | `<tuple>`
`__cpp_lib_constexpr_utility` | `201811L` | `std::pair`の`constexpr`追加対応（一部のコンストラクタと代入演算子） | `<utility>`
`__cpp_lib_constexpr_vector` | `201907L` | `std::vector`の`constexpr`対応 | `<vector>`
`__cpp_lib_coroutine` | `201902L` | `<coroutine>`ヘッダの追加 | `<coroutine>`
`__cpp_lib_destroying_delete` | `201806L` | `std::destroying_delete_t` | `<new>`
`__cpp_lib_endian` | `201907L` | `std::endian` | `<bit>`
`__cpp_lib_erase_if` | `202002L` | 各コンテナに対する`std::erase`、`std::erase_if`の特殊化 | `<string>` `<deque>` `<forward_list>` `<list>` `<vector>` `<map>` `<set>` `<unordered_map>` `<unordered_set>`
`__cpp_lib_execution` | `201902L` | `std::execution::unsequenced_policy` | `<execution>`
`__cpp_lib_format` | `201907L` `202106L` `202110L` | `<format>`ヘッダ コンパイル時フォーマット文字列検査/`std::vformat`のコードサイズ削減 `std::chrono`のフォーマットにおけるロケール指定の修正/`const`だとフォーマットできない型に対する対応 | `<format>`
`__cpp_lib_generic_unordered_lookup` | `201811L` | 非順序連想コンテナの`find(), count(), contains(), equal_range()`に対するHeterogeneous Overload追加 | `<unordered_map>` `<unordered_set>`
`__cpp_lib_int_pow2` | `202002L` | `<bit>`の2の冪乗に関する操作を行う関数の名前変更 | `<bit>`
`__cpp_lib_integer_comparison_functions` | `202002L` | `std::cmp_equal()`等の整数比較関数と`std::in_range()` | `<utility>`
`__cpp_lib_interpolate` | `201902L` | `std::lerp()`と`std::midpoint()` | `<cmath>` `<numeric>`
`__cpp_lib_is_constant_evaluated` | `201811L` | `std::is_constant_evaluated()` | `<type_traits>`
`__cpp_lib_is_layout_compatible` | `201907L` | `std::is_layout_compatible`と`std::is_corresponding_member` | `<type_traits>`
`__cpp_lib_is_nothrow_convertible` | `201806L` | `std::is_nothrow_convertible` | `<type_traits>`
`__cpp_lib_is_pointer_interconvertible` | `201907L` | `std::is_pointer_interconvertible_base_of`と`std::is_pointer_interconvertible_with_class` | `<type_traits>`
`__cpp_lib_jthread` | `201911L` | `std::jthread`と`stop_token`による協調的キャンセル機構 | `<stop_token>` `<thread>`
`__cpp_lib_latch` | `201907L` | `std::latch` | `<latch>`
`__cpp_lib_list_remove_return_type` | `201806L` | `std::list`と`std::forward_list`の`remove(), remove_if(), unique()`の戻り値型変更 | `<forward_list>` `<list>`
`__cpp_lib_math_constants` | `201907L` | 数学定数 | `<numbers>`
`__cpp_lib_polymorphic_allocator` | `201902L` | `std::pmr::polymorphic_allocator`の改修 | `<memory>`
`__cpp_lib_ranges` | `201911L` `202106L` `202110L` | RangeライブラリとRangeアルゴリズム `view`コンセプトのデフォルト構築要求を削除 所有権を持つ`view`の許可と`owning_view` | `<algorithm>` `<functional>` `<iterator>` `<memory>` `<ranges>`
`__cpp_lib_remove_cvref` | `201711L` | `std::remove_cvref` | `<type_traits>`
`__cpp_lib_semaphore` | `201907L` | `std::counting_semaphore`と`std::binary_semaphore` | `<semaphore>`
`__cpp_lib_shared_ptr_arrays` | `201707L` | `std::make_shared`と`std::allocate_shared`の配列対応 | `<memory>`
`__cpp_lib_shift` | `201806L` | `std::shift_left`と`std::shift_right` | `<algorithm>`
`__cpp_lib_smart_ptr_for_overwrite` | `202002L` | `std::make_shared_for_overwrite()`と`std::allocate_shared_for_overwrite()` | `<memory>`
`__cpp_lib_source_location` | `201907L` | `std::source_location` | `<source_location>`
`__cpp_lib_span` | `202002L` | `std::span` | `<span>`
`__cpp_lib_ssize` | `201902L` | `std::ssize()`と`std::span`で使用する整数型の符号なし（`size_t`）への変更 | `<iterator>`
`__cpp_lib_starts_ends_with` | `201711L` | `std::string`と`std::string_view`の`starts_with()`と`ends_with()` | `<string>` `<string_view>`
`__cpp_lib_string_view` | `201803L` | `std::string`と`std::string_view`のイテレータの`constexpr`対応 | `<string>` `<string_view>`
`__cpp_lib_syncbuf` | `201803L` | 同期化出力ストリーム（`std::osyncstream`）とバッファ（`std::syncbuf`） | `<syncstream>`
`__cpp_lib_three_way_comparison` | `201907L` | 標準ライブラリの三方比較演算子対応 | `<compare>`
`__cpp_lib_to_address` | `201711L` | `std::to_address()` | `<memory>`
`__cpp_lib_to_array` | `201907L` | `std::to_array()` | `<array>`
`__cpp_lib_type_identity` | `201806L` | `std::type_identity` | `<type_traits>`
`__cpp_lib_unwrap_ref` | `201811L` | `std::unwrap_reference`と`std::unwrap_ref_decay` | `<type_traits>`

## 参照

- SD-FeatureTest: Feature-Test Macros and Policies - isocpp