功能特性测试 (C++20)
标准中为 C++11 和之后引入的 C++ 语言和程序库的功能特性定义了一组预处理器宏。标准有意使之成为检测这些功能特性是否存在的一种简单且可移植的方式。
目录 |
[编辑]属性
__has_cpp_attribute( 属性记号) | |||||||||
检查是否支持(宏展开后)属性记号 指名的属性。
对于每个标准属性,__has_cpp_attribute
会展开成下表中的对应值(它是该属性被添加到工作草案中时的年份和月份)还是 0 由实现定义。它只会在此标准属性能够使得实现的行为遵循推荐要求时(包括发布诊断信息和改变类布局等各类行为)展开成下表中的对应值。
厂商特定的属性会以某个非零值确定。
可以在 #if 和 #elif 的表达式中展开 __has_cpp_attribute
。 #ifdef、 #ifndef、 #elifdef、 #elifndef(C++23 起) 和 defined 把它当做已定义的宏,但不能在别处使用它。
属性记号 | 属性 | 值 | 标准 | 标准文件 |
---|---|---|---|---|
assume | [[assume]] | 202207L | (C++23) | P1774R8 |
carries_dependency | [[carries_dependency]] | 200809L | (C++11) (C++26 前) | N2556 N2643 P3475R2 |
deprecated | [[deprecated]] | 201309L | (C++14) | N3760 |
fallthrough | [[fallthrough]] | 201603L | (C++17) | P0188R1 |
indeterminate | [[indeterminate]] | 202403L | (C++26) | P2795R5 |
likely | [[likely]] | 201803L | (C++20) | P0479R5 |
maybe_unused | [[maybe_unused]] | 201603L | (C++17) | P0212R1 |
no_unique_address | [[no_unique_address]] | 201803L | (C++20) | P0840R2 |
nodiscard | [[nodiscard]] | 201603L | (C++17) | P0189R1 |
给出理由的 [[nodiscard]] | 201907L | (C++20) | P1301R4 | |
noreturn | [[noreturn]] | 200809L | (C++11) | N2761 |
unlikely | [[unlikely]] | 201803L | (C++20) | P0479R5 |
属性总数:11 |
[编辑]语言功能特性
下列宏可以用来检测当前实现是否实现了某个语言功能特性。它们会在每个翻译单元预定义。
每个宏都会展开成对应于相应功能特性被包含到工作草案时的年份与月份的整数字面量。当功能特性发生了显著变更时,宏会相应地更新。
宏名 | 功能特性 | 值 | 标准 | 标准文件 |
---|---|---|---|---|
__cpp_aggregate_bases | 拥有基类的聚合类 | 201603L | (C++17) | P0017R1 |
__cpp_aggregate_nsdmi | 拥有默认成员初始化器的聚合类 | 201304L | (C++14) | N3653 |
__cpp_aggregate_paren_init | 具有直接初始化形式的聚合初始化 | 201902L | (C++20) | P0960R3 |
__cpp_alias_templates | 别名模版 | 200704L | (C++11) | N2258 |
__cpp_aligned_new | 过对齐数据的动态内存分配 | 201606L | (C++17) | P0035R4 |
__cpp_attributes | 属性 | 200809L | (C++11) | N2761 |
__cpp_auto_cast | auto(x) 和 auto{x} | 202110L | (C++23) | P0849R8 |
__cpp_binary_literals | 二进制字面量 | 201304L | (C++14) | N3472 |
__cpp_capture_star_this | 以 [=,*this] 进行 *this 的 lambda 按值捕获 | 201603L | (C++17) | P0018R3 |
__cpp_char8_t | char8_t | 201811L | (C++20) | P0482R6 |
char8_t 兼容性和可移植性修复(允许从 UTF-8 字符串字面量初始化(无符号)字符数组) | 202207L | (C++23) (DR20) | P2513R4 | |
__cpp_concepts | 概念 | 201907L | (C++20) | P0734R0 P1084R2 P1452R2 |
按条件平凡的特殊成员函数 | 202002L | P0848R3 P2493R0 | ||
__cpp_conditional_explicit | explicit(bool) | 201806L | (C++20) | P0892R2 |
__cpp_consteval | 立即函数 | 201811L | (C++20) | P1073R3 |
使 consteval 向上传播 | 202211L | (C++23) (DR20) | P2564R3 | |
__cpp_constexpr | constexpr | 200704L | (C++11) | N2235 |
放宽 constexpr 限制,非 const 的 constexpr 方法 | 201304L | (C++14) | N3652 | |
constexpr 的 lambda | 201603L | (C++17) | P0170R1 | |
在常量表达式中调用虚函数;constexpr 函数中的 try 块,常量表达式中的 dynamic_cast 和多态 typeid;constexpr 函数中的平凡默认初始化和汇编声明 | 201907L | (C++20) | P1064R0 P1002R1 P1327R1 P1331R2 P1668R1 | |
在常量求值中改变联合体的活跃成员 | 202002L | P1330R0 P2493R0 | ||
constexpr 函数中的非字面变量、标号和 goto 语句 | 202110L | (C++23) | P2242R3 | |
放松对 constexpr 函数和函数模板的一些限制 | 202207L | P2448R2 | ||
在 constexpr 函数中允许静态 constexpr 变量 | 202211L | P2647R1 | ||
从 void* 进行 constexpr 转换:走向 constexpr 类型擦除 | 202306L | (C++26) | P2738R1 | |
constexpr 布置 new | 202406L | P2747R2 | ||
__cpp_constexpr_dynamic_alloc | constexpr 函数中的动态存储期操作 | 201907L | (C++20) | P0784R7 |
__cpp_constexpr_exceptions | constexpr异常 | 202411L | (C++26) | P3068R6 |
__cpp_constexpr_in_decltype | 在为常量求值所需要时生成函数和变量的定义 | 201711L | (C++20) (DR11) | P0859R0 |
__cpp_constinit | constinit | 201907L | (C++20) | P1143R2 |
__cpp_contracts | 契约 | 202502L | (C++26) | P2900R14 |
__cpp_decltype | decltype | 200707L | (C++11) | N2343 |
__cpp_decltype_auto | 常规函数的返回类型推导 | 201304L | (C++14) | N3638 |
__cpp_deduction_guides | 类模板的模板实参推导(CTAD) | 201703L | (C++17) | P0091R3 P0512R0 P0620R0 |
聚合体与别名的 CTAD | 201907L | (C++20) | P1814R0 P1816R0 | |
__cpp_delegating_constructors | 委托构造函数 | 200604L | (C++11) | N1986 |
__cpp_deleted_function | 带消息的弃置函数定义(= delete("应给出理由");) | 202403L | (C++26) | P2573R2 |
__cpp_designated_initializers | 指派初始化器 | 201707L | (C++20) | P0329R4 |
__cpp_enumerator_attributes | 枚举项的属性 | 201411L | (C++17) | N4266 |
__cpp_explicit_this_parameter | 显式对象形参 | 202110L | (C++23) | P0847R7 |
__cpp_fold_expressions | 折叠表达式 | 201603L | (C++17) | N4295 P0036R0 |
涉及折叠表达式的约束的排序 | 202406L | (C++26) | P2963R3 | |
__cpp_generic_lambdas | 泛型 lambda 表达式 | 201304L | (C++14) | N3649 |
泛型 lambda 的显式模板形参列表 | 201707L | (C++20) | P0428R2 | |
__cpp_guaranteed_copy_elision | 通过简化的值类别保证复制消除 | 201606L | (C++17) | P0135R1 |
__cpp_hex_float | 十六进制浮点字面量 | 201603L | (C++17) | P0245R1 |
__cpp_if_consteval | if consteval | 202106L | (C++23) | P1938R3 |
__cpp_if_constexpr | if constexpr | 201606L | (C++17) | P0292R2 |
__cpp_impl_coroutine | 协程(编译器支持) | 201902L | (C++20) | P0912R5 LWG3393 |
__cpp_impl_destroying_delete | 销毁的 operator delete (编译器支持) | 201806L | (C++20) | P0722R3 |
__cpp_impl_three_way_comparison | 三路比较(编译器支持) | 201907L | (C++20) | P0515R3 P0768R1 P1185R2 P1630R1 |
__cpp_implicit_move | 简化的隐式移动 | 202207L | (C++23) | P2266R3 |
__cpp_inheriting_constructors | 继承构造函数 | 200802L | (C++11) | N2540 |
重述继承构造函数:有关继承构造函数的信规范(DR1941 等) | 201511L | (C++17) (DR11) | P0136R1 | |
__cpp_init_captures | lambda 的初始化捕获 | 201304L | (C++14) | N3648 |
允许 lambda 初始化捕获中的包展开 | 201803L | (C++20) | P0780R2 | |
__cpp_initializer_lists | 列表初始化与 std::initializer_list | 200806L | (C++11) | N2672 |
__cpp_inline_variables | 内联变量 | 201606L | (C++17) | P0386R2 |
__cpp_lambdas | lambda 表达式 | 200907L | (C++11) | N2927 |
__cpp_modules | 模块 | 201907L | (C++20) | P1103R3 P1811R0 |
__cpp_multidimensional_subscript | 多维下标运算符 | 202110L | (C++23) | P2128R6 |
静态的 operator[] | 202211L | P2589R1 | ||
__cpp_named_character_escapes | 具名的通用字符转义 | 202207L | (C++23) | P2071R2 |
__cpp_namespace_attributes | 命名空间的属性 | 201411L | (C++17) | N4266 |
__cpp_noexcept_function_type | 使异常说明为类型系统的一部分 | 201510L | (C++17) | P0012R1 |
__cpp_nontype_template_args | 允许全部常量模板实参的常量求值 | 201411L | (C++17) | N4268 |
常量模板形参中的类类型与浮点类型 | 201911L | (C++20) | P1907R1 | |
__cpp_nontype_template_parameter_auto | 以 auto 声明常量模板形参 | 201606L | (C++17) | P0127R2 |
__cpp_nsdmi | 非静态数据成员初始化器 | 200809L | (C++11) | N2756 |
__cpp_pack_indexing | 包索引 | 202311L | (C++26) | P2662R3 |
__cpp_placeholder_variables | 好用的无名占位符 | 202306L | (C++26) | P2169R4 |
__cpp_pp_embed | #embed | 202502L | (C++26) | P1967R14 |
__cpp_range_based_for | 基于范围的 for 循环 | 200907L | (C++11) | N2930 |
拥有不同类型的 begin /end 的基于范围的 for 循环 | 201603L | (C++17) | P0184R0 | |
基于范围的 for 循环的生存期延长 | 202211L | (C++23) | P2644R1 P2718R0 CWG2659 | |
__cpp_raw_strings | 原始字符串字面量 | 200710L | (C++11) | N2442 |
__cpp_ref_qualifiers | 引用限定符 | 200710L | (C++11) | N2439 |
__cpp_return_type_deduction | 常规函数的返回类型推导 | 201304L | (C++14) | N3638 |
__cpp_rvalue_references | 右值引用 | 200610L | (C++11) | N2118 |
__cpp_size_t_suffix | std::size_t 以及它的有符号版本的字面量后缀 | 202011L | (C++23) | P0330R8 |
__cpp_sized_deallocation | 具有大小的解分配函数 | 201309L | (C++14) | N3778 |
__cpp_static_assert | static_assert | 200410L | (C++11) | N1720 |
单参数的 static_assert | 201411L | (C++17) | N3928 | |
用户生成的 static_assert 消息 | 202306L | (C++26) | P2741R3 | |
__cpp_static_call_operator | 静态的 operator() | 202207L | (C++23) | P1169R4 |
__cpp_structured_bindings | 结构化绑定 | 201606L | (C++17) | P0217R3 |
结构化绑定的属性 | 202403L | (C++26) | P0609R3 | |
以结构化绑定声明为条件 | 202406L | P0963R3 | ||
结构化绑定可以引入包 | 202411L | P1061R10 | ||
__cpp_template_parameters | 概念和变量模板为模板形参 | 202502L | (C++26) | P2841R7 |
__cpp_template_template_args | 模板模板实参的匹配 | 201611L | (C++17) | P0522R0 |
__cpp_threadsafe_static_init | 并发的动态初始化和销毁 | 200806L | (C++11) | N2660 |
__cpp_trivial_relocatability | 可平凡重定位性 | 202502L | (C++26) | P2786R13 |
__cpp_trivial_union | 平凡联合体 | 202502L | (C++26) | P3074R7 |
__cpp_unicode_characters | 新字符类型(char16_t 与 char32_t) | 200704L | (C++11) | N2249 |
__cpp_unicode_literals | Unicode 字符串字面量 | 200710L | (C++11) | N2442 |
__cpp_user_defined_literals | 用户定义字面量 | 200809L | (C++11) | N2765 |
__cpp_using_enum | using enum | 201907L | (C++20) | P1099R5 |
__cpp_variable_templates | 变量模板 | 201304L | (C++14) | N3651 |
__cpp_variadic_friend | 变参友元声明 | 202403L | (C++26) | P2893R3 |
__cpp_variadic_templates | 变参模板 | 200704L | (C++11) | N2242 |
__cpp_variadic_using | using 声明中的包展开 | 201611L | (C++17) | P0195R2 |
宏的总数量:76 |
[编辑]标准库功能特性
下列宏可以用来检测当前实现是否实现了某个标准库功能特性。和语言功能特性测试宏不同,它们不会被预定义,而是由标头 <version> 提供。
对于每个标准库功能特性宏,它也会由提供了与该宏相关的标准库组件的标头提供。完整表单列表请参阅库功能特性测试宏。
每个宏都展开成它对应的功能特性被包含于工作草案时的年份与月份的相应整数字面量。当功能特性发生了显著变更时,宏会相应地更新。
宏名 | 功能特性 | 值 | 标准 | 标准文件 |
---|---|---|---|---|
__cpp_lib_adaptor_iterator_pair_constructor | std::stack 与 std::queue 的迭代器对构造函数 | 202106L | (C++23) | P1425R4 |
__cpp_lib_addressof_constexpr | constexpr 的 std::addressof | 201603L | (C++17) | LWG2296 |
__cpp_lib_algorithm_default_value_type | 为各算法启用列表初始化 | 202403L | (C++26) | P2248R8 P3217R0 |
__cpp_lib_algorithm_iterator_requirements | 范围迭代器作为非范围算法的输入 | 202207L | (C++23) | P2408R5 |
__cpp_lib_aligned_accessor | std::aligned_accessor:采用过量对齐指针的 std::mdspan 访问器 | 202411L | (C++26) | P2897R7 |
__cpp_lib_allocate_at_least | 反馈大小的分配器接口,例如:std::allocator::allocate_at_least 和 std::allocator_traits::allocate_at_least | 202302L | (C++23) | P0401R6 P2652R2 LWG3887 |
__cpp_lib_allocator_traits_is_always_equal | std::allocator_traits::is_always_equal,清理 noexcept | 201411L | (C++17) | N4258 |
__cpp_lib_any | std::any | 201606L | (C++17) | P0220R1 P0032R3 |
__cpp_lib_apply | std::apply | 201603L | (C++17) | P0220R1 |
__cpp_lib_array_constexpr | constexpr 的 std::reverse_iterator、std::move_iterator、std::array 和 范围访问 | 201603L | (C++17) | P0031R0 |
常量表达式迭代器(ConstexprIterator) ;std::array 的 constexpr 比较;其他的 constexpr(std::array::fill 等) | 201811L | (C++20) | P0858R0 LWG3257 P1023R0 P1032R1 | |
__cpp_lib_as_const | std::as_const | 201510L | (C++17) | P0007R1 |
__cpp_lib_associative_heterogeneous_erasure | 关联容器和无序关联容器的异质擦除 | 202110L | (C++23) | P2077R3 |
__cpp_lib_associative_heterogeneous_insertion | 剩余的有序和无序关联容器中剩余成员函数的异质重载 | 202306L | (C++26) | P2363R5 |
__cpp_lib_assume_aligned | std::assume_aligned | 201811L | (C++20) | P1007R3 |
__cpp_lib_atomic_flag_test | std::atomic_flag::test | 201907L | (C++20) | P1135R6 |
__cpp_lib_atomic_float | 原子浮点类型 | 201711L | (C++20) | P0020R6 |
__cpp_lib_atomic_is_always_lock_free | constexpr 的 std::atomic<T>::is_always_lock_free | 201603L | (C++17) | P0152R1 |
__cpp_lib_atomic_lock_free_type_aliases | 原子免锁整数类型(std::atomic_signed_lock_free 和 std::atomic_unsigned_lock_free) | 201907L | (C++20) | P1135R6 |
__cpp_lib_atomic_min_max | 原子最大值和最小值(std::atomic::fetch_min、std::atomic::fetch_max 等) | 202403L | (C++26) | P0493R5 |
__cpp_lib_atomic_ref | std::atomic_ref | 201806L | (C++20) | P0019R8 |
std::atomic_ref::address() | 202411L | (C++26) | P2835R7 | |
__cpp_lib_atomic_shared_ptr | std::atomic<std::shared_ptr> | 201711L | (C++20) | P0718R2 |
__cpp_lib_atomic_value_initialization | 修复原子初始化(默认进行 std::atomic 值初始化) | 201911L | (C++20) | P0883R2 |
__cpp_lib_atomic_wait | 高效的 std::atomic 等待 | 201907L | (C++20) | P1135R6 |
__cpp_lib_barrier | std::barrier | 201907L | (C++20) | P1135R6 |
std::barrier 的阶段完成保障 | 202302L | (C++23) | P2588R3 | |
__cpp_lib_bind_back | std::bind_back | 202202L | (C++23) | P2387R3 |
允许将可调用对象作为常量模板实参传递给 std::bind_back | 202306L | (C++26) | P2714R1 | |
__cpp_lib_bind_front | std::bind_front | 201907L | (C++20) | P0356R5 P1651R0 |
允许将可调用对象作为常量模板实参传递给 std::bind_front | 202306L | (C++26) | P2714R1 | |
__cpp_lib_bit_cast | std::bit_cast | 201806L | (C++20) | P0476R2 |
__cpp_lib_bitops | 位操纵 | 201907L | (C++20) | P0553R4 |
__cpp_lib_bitset | std::bitset 的 std::string_view 接口 | 202306L | (C++26) | P2697R1 |
__cpp_lib_bool_constant | std::bool_constant | 201505L | (C++17) | N4389 |
__cpp_lib_bounded_array_traits | std::is_bounded_array、std::is_unbounded_array | 201902L | (C++20) | P1357R1 |
__cpp_lib_boyer_moore_searcher | 搜索器 | 201603L | (C++17) | P0220R1 |
__cpp_lib_byte | std::byte | 201603L | (C++17) | P0298R3 |
__cpp_lib_byteswap | std::byteswap | 202110L | (C++23) | P1272R4 |
__cpp_lib_char8_t | char8_t 的库支持 | 201907L | (C++20) | P0482R6 P1423R3 |
__cpp_lib_chrono | std::chrono::duration 和 std::chrono::time_point 的舍入函数 | 201510L | (C++17) | P0092R1 |
使得 std::chrono::duration 和 std::chrono::time_point 的所有成员函数 constexpr | 201611L | P0505R0 | ||
日历和时区 | 201907L | (C++20) | P0355R7 P1466R3 | |
std::chrono 值类的散列支持 | 202306L | (C++26) | P2592R3 | |
__cpp_lib_chrono_udls | 时间类型的用户定义字面量 | 201304L | (C++14) | N3642 |
__cpp_lib_clamp | std::clamp | 201603L | (C++17) | P0025R1 |
__cpp_lib_common_reference | 使 std::reference_wrapper 的 std::common_reference_t 是引用类型 | 202302L | (C++23) | P2655R3 |
__cpp_lib_common_reference_wrapper | 使 std::reference_wrapper 的 std::common_reference_t 是引用类型 | 202302L | (C++23) | P2655R3 |
__cpp_lib_complex_udls | std::complex 的用户定义字面量]] | 201309L | (C++14) | N3779 |
__cpp_lib_concepts | 标准库概念 | 202002L | (C++20) | P0898R3 P1754R1 P1964R2 |
仅移动类型的 equality_comparable_with 、totally_ordered_with 和 three_way_comparable_with | 202207L | (C++23) | P2404R3 | |
__cpp_lib_constexpr_algorithms | constexpr 的算法 | 201806L | (C++20) | P0202R3 P0879R0 LWG3256 LWG3792 |
constexpr 的稳定排序 | 202306L | (C++26) | P2562R1 | |
__cpp_lib_constexpr_atomic | constexprstd::atomic 与 std::atomic_ref | 202411L | (C++26) | P3309R3 |
__cpp_lib_constexpr_bitset | 使 std::bitset 更 constexpr | 202207L | (C++23) | P2417R2 |
__cpp_lib_constexpr_charconv | constexpr 的 std::to_chars 和 std::from_chars 对整数类型的重载 | 202207L | (C++23) | P2291R3 |
__cpp_lib_constexpr_cmath | constexpr 的 <cmath> 和 <cstdlib> 中的数学函数 | 202202L | (C++23) | P0533R9 |
使 <cmath> 更 constexpr | 202306L | (C++26) | P1383R2 | |
__cpp_lib_constexpr_complex | constexpr 的 std::complex | 201711L | (C++20) | P0415R1 |
使 <complex> 更 constexpr | 202306L | (C++26) | P1383R2 | |
__cpp_lib_constexpr_deque | constexprstd::deque | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_dynamic_alloc | constexpr 的 std::allocator 和相关工具 | 201907L | (C++20) | P0784R7 |
__cpp_lib_constexpr_exceptions | 异常类型的 constexpr,例如 std::bad_alloc、std::bad_cast 等 | 202411L | (C++26) | P3068R6 |
使异常类型更 constexpr | 202502L | P3378R2 | ||
__cpp_lib_constexpr_flat_map | constexpr 的 std::flat_map 与 std::flat_multimap | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_flat_set | constexpr 的 std::flat_set 与 std::flat_multiset | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_forward_list | constexprstd::forward_list | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_functional | 其他部分的 constexpr(std::default_searcher);constexpr 的 INVOKE | 201907L | (C++20) | P1032R1 P1065R2 |
__cpp_lib_constexpr_functional | 其他部分的 constexpr(std::default_searcher);constexpr 的 INVOKE | 201907L | (C++20) | P1032R1 P1065R2 |
__cpp_lib_constexpr_inplace_vector | 非平凡类型 std::inplace_vector 的 constexpr | 202502L | (C++26) | P3074R7 |
__cpp_lib_constexpr_iterator | 其他部分的 constexpr(std::insert_iterator 等) | 201811L | (C++20) | P1032R1 |
__cpp_lib_constexpr_list | constexprstd::list | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_map | constexpr 的 std::map 与 std::multimap | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_memory | constexpr 的 std::pointer_traits | 201811L | (C++20) | P1006R1 |
constexpr 的 std::unique_ptr | 202202L | (C++23) | P2273R3 | |
__cpp_lib_constexpr_new | constexpr 的 布置 new | 202406L | (C++26) | P2747R2 |
__cpp_lib_constexpr_numeric | <numeric> 中的 constexpr 的 算法 | 201911L | (C++20) | P1645R1 |
__cpp_lib_constexpr_queue | constexprstd::queue | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_set | constexpr 的 std::set 与 std::multiset | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_stack | constexprstd::stack | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_string | constexprstd::char_traits | 201611L | (C++17) | P0426R1 |
constexprstd::string | 201907L | (C++20) | P0980R1 | |
__cpp_lib_constexpr_string_view | 其他部分的 constexpr(std::string_view::copy) | 201811L | (C++20) | P1032R1 |
__cpp_lib_constexpr_tuple | 其他部分的 constexpr(std::tuple::operator= 等) | 201811L | (C++20) | P1032R1 |
__cpp_lib_constexpr_typeinfo | constexpr 的 std::type_info::operator== | 202106L | (C++23) | P1328R1 |
__cpp_lib_constexpr_unordered_map | constexpr 的 std::unordered_map 与 std::unordered_multimap | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_unordered_set | constexpr 的 std::unordered_set 与 std::unordered_multiset | 202502L | (C++26) | P3372R3 |
__cpp_lib_constexpr_utility | 其他部分的 constexpr(std::pair::operator= 等) | 201811L | (C++20) | P1032R1 |
__cpp_lib_constexpr_vector | constexpr 的 std::vector | 201907L | (C++20) | P1004R2 |
__cpp_lib_constrained_equality | std::pair、std::tuple、std::optional 和 std::variant 的受约束关系运算符 | 202403L | (C++26) | P2944R3 |
约束 std::expected 的相等性运算符 | 202411L | P3379R0 | ||
__cpp_lib_containers_ranges | 字符串和容器的范围构造和插入 | 202202L | (C++23) | P1206R7 |
__cpp_lib_contracts | <contracts>:契约支持 | 202502L | (C++26) | P2900R14 |
__cpp_lib_copyable_function | std::copyable_function | 202306L | (C++26) | P2548R6 |
__cpp_lib_coroutine | 协程(库支持) | 201902L | (C++20) | P0912R5 LWG3393 |
__cpp_lib_debugging | <debugging>:调试支持 | 202311L | (C++26) | P2546R5 |
可替换 std::is_debugger_present | 202403L | P2810R4 | ||
__cpp_lib_destroying_delete | 销毁的 operator delete(库支持) | 201806L | (C++20) | P0722R3 |
__cpp_lib_enable_shared_from_this | std::enable_shared_from_this::weak_from_this | 201603L | (C++17) | P0033R1 |
__cpp_lib_endian | std::endian | 201907L | (C++20) | P0463R1 P1612R1 |
__cpp_lib_erase_if | 统一的容器擦除 | 202002L | (C++20) | P1209R0 P1115R3 |
__cpp_lib_exchange_function | std::exchange | 201304L | (C++14) | N3668 |
__cpp_lib_execution | 执行策略 | 201603L | (C++17) | P0024R2 |
std::execution::unsequenced_policy | 201902L | (C++20) | P1001R2 | |
__cpp_lib_expected | 类模板 std::expected | 202202L | (C++23) | P0323R12 |
std::expected 的单子式函数 | 202211L | P2505R5 | ||
__cpp_lib_filesystem | 文件系统库 | 201703L | (C++17) | P0218R1 P0219R1 P0392R0 P0317R1 |
__cpp_lib_flat_map | std::flat_map 和 std::flat_multimap | 202207L | (C++23) | P0429R9 |
__cpp_lib_flat_set | std::flat_set 和 std::flat_multiset | 202207L | (C++23) | P1222R4 LWG3751 |
__cpp_lib_format | 文本格式化 | 201907L | (C++20) | P0645R10 P1361R2 P1652R1 |
编译时格式字符串检查;减少 std::vformat_to 的参数化 | 202106L | (C++23) (DR20) | P2216R3 | |
修复 chrono 格式化器中的本地环境处理;支持非 const 可格式化类型 | 202110L | P2372R3 P2418R2 | ||
暴露 std::basic_format_string;澄清 chrono 类型的本地化的格式化的编码处理 | 202207L | (C++23) | P2419R2 P2508R1 | |
格式化指针 | 202304L | (C++26) | P2510R3 | |
格式化参数的类型检查 | 202305L | P2757R3 | ||
visit 成员 | 202306L | P2637R3 | ||
运行时格式字符串 | 202311L | P2918R2 | ||
__cpp_lib_format_path | std::filesystem::path 的格式化 | 202403L | (C++26) | P2845R8 |
__cpp_lib_format_ranges | 格式化范围 | 202207L | (C++23) | P2286R8 P2585R1 LWG3750 |
__cpp_lib_format_uchar | 修正代码单元作为整数的格式化 | 202311L | (C++26) | P2909R4 |
__cpp_lib_formatters | 格式化 std::thread::id 和 std::stacktrace | 202302L | (C++23) | P2693R1 |
__cpp_lib_forward_like | std::forward_like | 202207L | (C++23) | P2445R1 |
__cpp_lib_freestanding_algorithm | <algorithm> 中的独立设施 | 202311L | (C++26) | P2407R5 |
独立实现库:<algorithm> | 202502L | P2976R1 | ||
__cpp_lib_freestanding_array | 使 std::array 的部分功能独立 | 202311L | (C++26) | P2407R5 |
__cpp_lib_freestanding_char_traits | 独立的 std::char_traits | 202306L | (C++26) | P2338R4 |
__cpp_lib_freestanding_execution | 独立实现库:<execution> | 202502L | (C++26) | P2976R1 |
__cpp_lib_freestanding_charconv | <charconv> 中的独立设施 | 202306L | (C++26) | P2338R4 |
__cpp_lib_freestanding_cstdlib | <cstdlib> 中的独立设施 | 202306L | (C++26) | P2338R4 |
__cpp_lib_freestanding_cstring | <cstring> 中的独立设施 | 202306L | (C++26) | P2338R4 |
从独立设施中移除 std::strtok | 202311L | P2937R0 | ||
__cpp_lib_freestanding_cwchar | <cwchar> 中的独立设施 | 202306L | (C++26) | P2338R4 |
__cpp_lib_freestanding_errc | 独立的 std::errc | 202306L | (C++26) | P2338R4 |
__cpp_lib_freestanding_expected | 使 std::expected 的部分功能独立 | 202311L | (C++26) | P2833R2 |
__cpp_lib_freestanding_feature_test_macros | 支持独立的功能特性测试宏 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_functional | <functional> 中的独立设施 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_iterator | <iterator> 中的独立设施 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_mdspan | 独立的 std::mdspan | 202311L | (C++26) | P2833R2 |
__cpp_lib_freestanding_memory | <memory> 中的独立设施 | 202306L | (C++26) | P2198R7 |
独立实现库:<memory> | 202502L | P2976R1 | ||
__cpp_lib_freestanding_numeric | <numeric> 中的独立设施(饱和算术) | 202311L | (C++26) | P0543R3 |
独立实现库:<numeric> | 202502L | P2976R1 | ||
__cpp_lib_freestanding_operator_new | operator new 的定义(在独立实现中可选) | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_optional | 使 std::optional 的部分功能独立 | 202311L | (C++26) | P2407R5 |
__cpp_lib_freestanding_random | 独立实现库:<random> | 202502L | (C++26) | P2976R1 |
__cpp_lib_freestanding_ranges | <ranges> 中的独立设施 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_ratio | <ratio> 中的独立设施 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_string_view | 使 std::string_view 的部分功能独立 | 202311L | (C++26) | P2407R5 |
__cpp_lib_freestanding_tuple | <tuple> 中的独立设施 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_utility | <utility> 中的独立设施 | 202306L | (C++26) | P2198R7 |
__cpp_lib_freestanding_variant | 使 std::variant 的部分功能独立 | 202311L | (C++26) | P2407R5 |
__cpp_lib_fstream_native_handle | 获得文件流的原生把柄 | 202306L | (C++26) | P1759R6 |
__cpp_lib_function_ref | std::function_ref:类型擦除的可调用对象的引用 | 202306L | (C++26) | P0792R14 |
__cpp_lib_gcd_lcm | std::gcd、std::lcm | 201606L | (C++17) | P0295R0 |
__cpp_lib_generator | std::generator:范围的同步协程生成器 | 202207L | (C++23) | P2502R2 |
__cpp_lib_generic_associative_lookup | 关联容器的异质比较查找 | 201304L | (C++14) | N3657 |
__cpp_lib_generic_unordered_lookup | 无序关联容器的异质比较查找 | 201811L | (C++20) | P0919R3 |
__cpp_lib_hardened_array | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_basic_string | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_basic_string_view | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_bitset | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_deque | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_expected | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_forward_list | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_inplace_vector | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_list | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_mdspan | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_optional | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_span | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_valarray | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardened_vector | 标准库加固(仅在加固实现中提供) | 202502L | (C++26) | P3471R4 |
__cpp_lib_hardware_interference_size | constexpr 的 std::hardware_{constructive, destructive}_interference_size | 201703L | (C++17) | P0154R1 |
__cpp_lib_hive | <hive>:一种基于桶的容器,可重用已擦除元素的内存位置 | 202502L | (C++26) | P0447R28 |
__cpp_lib_has_unique_object_representations | std::has_unique_object_representations | 201606L | (C++17) | P0258R2 |
__cpp_lib_hazard_pointer | <hazard_pointer>:风险指针 | 202306L | (C++26) | P2530R3 |
__cpp_lib_hypot | std::hypot 的三实参重载 | 201603L | (C++17) | P0030R1 |
__cpp_lib_incomplete_container_elements | std::forward_list、std::list 和 std::vector 的最小化不完整类型支持 | 201505L | (C++17) | N4510 |
__cpp_lib_indirect | std::indirect | 202502L | (C++26) | P3019R13 |
__cpp_lib_inplace_vector | std::inplace_vector:可动态调整大小的固定容量向量(原位存储) | 202406L | (C++26) | P0843R14 |
__cpp_lib_int_pow2 | 2 的整数次幂运算(std::has_single_bit、std::bit_ceil、std::bit_floor、std::bit_width) | 202002L | (C++20) | P0556R3 P1956R1 |
__cpp_lib_integer_comparison_functions | 整数比较函数 | 202002L | (C++20) | P0586R2 |
__cpp_lib_integer_sequence | 编译期的整数序列 | 201304L | (C++14) | N3658 |
__cpp_lib_integral_constant_callable | std::integral_constant::operator() | 201304L | (C++14) | N3545 |
__cpp_lib_interpolate | std::lerp、std::midpoint | 201902L | (C++20) | P0811R3 |
__cpp_lib_invoke | std::invoke | 201411L | (C++17) | N4169 |
__cpp_lib_invoke_r | std::invoke_r | 202106L | (C++23) | P2136R3 |
__cpp_lib_ios_noreplace | 为 fstream 添加排他模式 | 202207L | (C++23) | P2467R1 |
__cpp_lib_is_aggregate | std::is_aggregate | 201703L | (C++17) | LWG2911 |
__cpp_lib_is_constant_evaluated | std::is_constant_evaluated | 201811L | (C++20) | P0595R2 |
__cpp_lib_is_final | std::is_final | 201402L | (C++14) | LWG2112 |
__cpp_lib_is_implicit_lifetime | std::is_implicit_lifetime | 202302L | (C++23) | P2674R1 |
__cpp_lib_is_invocable | std::is_invocable、std::invoke_result | 201703L | (C++17) | P0604R0 |
__cpp_lib_is_layout_compatible | std::is_layout_compatible | 201907L | (C++20) | P0466R5 |
__cpp_lib_is_nothrow_convertible | std::is_convertible | 201806L | (C++20) | P0758R1 LWG3356 |
__cpp_lib_is_null_pointer | std::is_null_pointer | 201309L | (C++14) (DR11) | LWG2247 |
__cpp_lib_is_pointer_interconvertible | 指针可互转换特征:std::is_pointer_interconvertible_with_class 和 std::is_pointer_interconvertible_base_of | 201907L | (C++20) | P0466R5 |
__cpp_lib_is_scoped_enum | std::is_scoped_enum | 202011L | (C++23) | P1048R1 |
__cpp_lib_is_sufficiently_aligned | std::is_sufficiently_aligned:检查指针对齐前条件 | 202411L | (C++26) | P2897R7 |
__cpp_lib_is_swappable | (不抛出的)可交换特征 | 201603L | (C++17) | P0185R1 |
__cpp_lib_is_virtual_base_of | std::is_virtual_base_of:用于检测虚基类的类型特征 | 202406L | (C++26) | P2985R0 |
__cpp_lib_is_within_lifetime | 检查联合体可选项是否活跃(std::is_within_lifetime) | 202306L | (C++26) | P2641R4 |
__cpp_lib_jthread | 停止令牌和自动合并线程 | 201911L | (C++20) | P0660R10 P1869R1 |
__cpp_lib_latch | std::latch | 201907L | (C++20) | P1135R6 |
__cpp_lib_launder | CWG 问题 1776:替换包含引用成员的类对象(std::launder) | 201606L | (C++17) | P0137R1 |
__cpp_lib_linalg | 一套基于 BLAS 的自由函数线性代数接口 | 202311L | (C++26) | P1673R13 |
__cpp_lib_list_remove_return_type | 修改 std::forward_list 和 std::list 的 remove() 、remove_if() 和 unique() 成员的返回值类型 | 201806L | (C++20) | P0646R1 |
__cpp_lib_logical_traits | 类型特征的逻辑运算 | 201510L | (C++17) | P0013R1 |
__cpp_lib_make_from_tuple | std::make_from_tuple | 201606L | (C++17) | P0209R2 |
__cpp_lib_make_reverse_iterator | std::make_reverse_iterator | 201402L | (C++14) | LWG2285 |
__cpp_lib_make_unique | std::make_unique | 201304L | (C++14) | N3656 |
__cpp_lib_map_try_emplace | std::map::try_emplace、std::map::insert_or_assign | 201411L | (C++17) | N4279 |
__cpp_lib_math_constants | 数学常量 | 201907L | (C++20) | P0631R8 |
__cpp_lib_math_special_functions | 特殊数学函数 | 201603L | (C++17) | P0226R1 |
__cpp_lib_mdspan | std::mdspan | 202207L | (C++23) | P0009R18 P2599R2 P2604R0 P2613R1 |
std::mdspan 的 std::dims | 202406L | (C++26) | P2389R2 | |
__cpp_lib_memory_resource | std::pmr::memory_resource | 201603L | (C++17) | P0220R1 |
__cpp_lib_modules | 标准库模块std 和 std.compat | 202207L | (C++23) | P2465R3 |
__cpp_lib_move_iterator_concept | 使 std::move_iterator<T*> 是随机访问迭代器 | 202207L | (C++23) | P2520R0 |
__cpp_lib_move_only_function | std::move_only_function | 202110L | (C++23) | P0288R9 |
__cpp_lib_node_extract | 拼合映射和集合(std::map::extract、std::map::merge、std::map::insert(node_type) 等) | 201606L | (C++17) | P0083R3 |
__cpp_lib_nonmember_container_access | std::size、std::data 和 std::empty | 201411L | (C++17) | N4280 |
__cpp_lib_not_fn | std::not_fn | 201603L | (C++17) | P0005R4 |
允许将可调用对象作为常量模板实参传递给 std::not_fn | 202306L | (C++26) | P2714R1 | |
__cpp_lib_null_iterators | 空的老式向前迭代器(LegacyForwardIterator) | 201304L | (C++14) | N3644 |
__cpp_lib_optional | std::optional | 201606L | (C++17) | P0220R1 P0032R3 P0307R2 |
完全 constexpr 的 std::optional | 202106L | (C++23) (DR20) | P2231R1 | |
std::optional 的单子式运算 | 202110L | (C++23) | P0798R8 LWG3621 | |
__cpp_lib_optional_range_support | std::optional 的范围支持 | 202406L | (C++26) | P3168R2 |
__cpp_lib_out_ptr | std::out_ptr、std::inout_ptr | 202106L | (C++23) | P1132R8 |
独立的 std::out_ptr 和 std::inout_ptr | 202311L | (C++26) | P2833R2 | |
__cpp_lib_parallel_algorithm | 并行算法 | 201603L | (C++17) | P0024R2 |
__cpp_lib_polymorphic | std::polymorphic | 202502L | (C++26) | P3019R13 |
__cpp_lib_polymorphic_allocator | std::pmr::polymorphic_allocator<> 作为基础词汇类型 | 201902L | (C++20) | P0339R6 LWG3437 |
__cpp_lib_print | 格式化的输出 | 202207L | (C++23) | P2093R14 |
允许一种 std::print 高效实现 | 202403L | (C++26) (DR23) | P3107R5 P3235R3 | |
用 std::println 打印空行 | 202403L | (C++26) | P3142R0 | |
__cpp_lib_quoted_string_io | std::quoted | 201304L | (C++14) | N3654 |
__cpp_lib_philox_engine | std::philox_engine:基于计数器的随机数引擎 | 202406L | (C++26) | P2075R6 |
__cpp_lib_ranges | 范围库和受约束算法 | 201911L | (C++20) | P0896R4 P1035R7 P1716R3 |
不可默认初始化的视图 | 202106L | (C++23) (DR20) | P2325R3 | |
带所有权的视图 | 202110L | P2415R2 | ||
std::ranges::range_adaptor_closure | 202202L | (C++23) | P2387R3 | |
放松对范围适配器要求以允许仅移动类型 | 202207L | P2494R2 | ||
移除 ranges::begin、ranges::end、ranges::rbegin、ranges::rend 和 ranges::size 的“毒药丸”重载 | 202211L | P2602R2 | ||
放松对范围要求以允许某些投影 | 202302L | P2609R3 | ||
移除可间接调用概念中的公共引用要求 | 202406L | (C++26) (DR20) | P2997R1 | |
__cpp_lib_ranges_as_const | std::const_iterator、std::ranges::as_const_view | 202207L | (C++23) | P2278R4 |
使 std::basic_const_iterator 遵守其底层类型的可转换性 | 202311L | (C++26) | P2836R1 | |
__cpp_lib_ranges_as_rvalue | std::ranges::as_rvalue_view | 202207L | (C++23) | P2446R2 |
__cpp_lib_ranges_cache_latest | std::ranges::cache_latest_view | 202411L | (C++26) | P3138R5 |
__cpp_lib_ranges_cartesian_product | std::ranges::cartesian_product_view | 202207L | (C++23) | P2374R4 P2540R1 |
__cpp_lib_ranges_chunk | std::ranges::chunk_view | 202202L | (C++23) | P2442R1 |
__cpp_lib_ranges_chunk_by | std::ranges::chunk_by_view | 202202L | (C++23) | P2443R1 |
__cpp_lib_ranges_concat | std::ranges::concat_view | 202403L | (C++26) | P2542R8 |
__cpp_lib_ranges_contains | std::ranges::contains | 202207L | (C++23) | P2302R4 |
__cpp_lib_ranges_enumerate | std::ranges::enumerate_view | 202302L | (C++23) | P2164R9 |
__cpp_lib_ranges_find_last | std::ranges::find_last、std::ranges::find_last_if 和 std::ranges::find_last_if_not | 202207L | (C++23) | P1223R5 LWG3807 |
__cpp_lib_ranges_fold | std::ranges 折叠算法 | 202207L | (C++23) | P2322R6 |
__cpp_lib_ranges_generate_random | 随机数生成的向量 API(std::ranges::generate_random) | 202403L | (C++26) | P1068R11 |
__cpp_lib_ranges_iota | std::ranges::iota | 202202L | (C++23) | P2440R1 |
__cpp_lib_ranges_join_with | std::ranges::join_with_view | 202202L | (C++23) | P2441R2 |
__cpp_lib_ranges_repeat | std::ranges::repeat_view | 202207L | (C++23) | P2474R2 |
__cpp_lib_ranges_reserve_hint | std::ranges::approximately_sized_range 与 std::ranges::reserve_hint | 202502L | (C++26) | P2846R6 |
__cpp_lib_ranges_slide | std::ranges::slide_view | 202202L | (C++23) | P2442R1 |
__cpp_lib_ranges_starts_ends_with | std::ranges::starts_with、std::ranges::ends_with | 202106L | (C++23) | P1659R3 |
__cpp_lib_ranges_stride | std::ranges::stride_view | 202207L | (C++23) | P1899R3 |
__cpp_lib_ranges_to_container | std::ranges::to | 202202L | (C++23) | P1206R7 |
__cpp_lib_ranges_to_input | std::ranges::to_input_view | 202502L | (C++26) | P3137R3 |
__cpp_lib_ranges_zip | std::ranges::zip_view, std::ranges::zip_transform_view, std::ranges::adjacent_view、std::ranges::adjacent_transform_view | 202110L | (C++23) | P2321R2 |
__cpp_lib_ratio | 添加新的 2022 国际单位制(SI)前缀 | 202306L | (C++26) | P2734R0 |
__cpp_lib_raw_memory_algorithms | 扩展的内存管理工具 | 201606L | (C++17) | P0040R3 |
constexpr 的特化内存算法 | 202411L | (C++26) | P3508R0 P3369R0 | |
__cpp_lib_rcu | <rcu>:读-复制更新(RCU) | 202306L | (C++26) | P2545R4 |
__cpp_lib_reference_from_temporary | std::reference_constructs_from_temporary 和 std::reference_converts_from_temporary | 202202L | (C++23) | P2255R2 |
__cpp_lib_reference_wrapper | std::reference_wrapper 的比较 | 202403L | (C++26) | P2944R3 |
__cpp_lib_remove_cvref | std::remove_cvref | 201711L | (C++20) | P0550R2 |
__cpp_lib_result_of_sfinae | std::result_of 和 SFINAE | 201210L | (C++14) | N3462 |
__cpp_lib_robust_nonmodifying_seq_ops | 使非修改的序列操作更加稳健(std::mismatch、std::equal 和 std::is_permutation 的两范围重载) | 201304L | (C++14) | N3671 |
__cpp_lib_sample | std::sample | 201603L | (C++17) | P0220R1 |
__cpp_lib_saturation_arithmetic | 饱和算术 | 202311L | (C++26) | P0543R3 |
__cpp_lib_scoped_lock | std::scoped_lock | 201703L | (C++17) | P0156R2 |
__cpp_lib_semaphore | std::counting_semaphore、std::binary_semaphore | 201907L | (C++20) | P1135R6 |
__cpp_lib_senders | std::execution:执行控制的发送器/接收器模型 | 202406L | (C++26) | P2300R10 |
__cpp_lib_shared_mutex | std::shared_mutex(无时限) | 201505L | (C++17) | N4508 |
__cpp_lib_shared_ptr_arrays | std::shared_ptr<T[]> | 201611L | (C++17) | P0497R0 |
std::make_shared 的数组支持 | 201707L | (C++20) | P0674R1 | |
__cpp_lib_shared_ptr_weak_type | shared_ptr::weak_type | 201606L | (C++17) | P0163R0 |
__cpp_lib_shared_timed_mutex | std::shared_timed_mutex | 201402L | (C++14) | N3891 |
__cpp_lib_shift | std::shift_left 和 std::shift_right | 201806L | (C++20) | P0769R2 |
std::ranges::shift_left 和 std::ranges::shift_right | 202202L | (C++23) | P2440R1 | |
__cpp_lib_simd | <simd>: 数据并行类型 | 202411L | (C++26) | P1928R15 P3430R3 P3441R2 P3287R3 P2933R4 |
__cpp_lib_simd_complex | 对 std::simd 中交错复数值的支持 | 202502L | (C++26) | P2663R7 |
__cpp_lib_smart_ptr_for_overwrite | 用默认初始化创建智能指针(std::allocate_shared_for_overwrite、std::make_shared_for_overwrite、std::make_unique_for_overwrite) | 202002L | (C++20) | P1020R1 P1973R1 |
__cpp_lib_smart_ptr_owner_equality | 使得 std::weak_ptr 可以作为无序关联容器的键 | 202306L | (C++26) | P1901R2 |
__cpp_lib_source_location | 源代码信息捕获(std::source_location) | 201907L | (C++20) | P1208R6 |
__cpp_lib_span | std::span | 202002L | (C++20) | P0122R7 LWG3274 P1024R3 P1976R2 |
使 std::span 的部分功能独立 | 202311L | (C++26) | P2821R5 P2833R2 | |
__cpp_lib_span_initializer_list | 从初始化器列表构造 std::span | 202311L | (C++26) | P2447R6 |
__cpp_lib_spanstream | std::spanbuf、std::spanstream | 202106L | (C++23) | P0448R4 |
__cpp_lib_ssize | std::ssize 和无符号 std::span::size | 201902L | (C++20) | P1227R2 |
__cpp_lib_sstream_from_string_view | std::stringstream 的 std::string_view 接口 | 202306L | (C++26) | P2495R3 |
__cpp_lib_stacktrace | 栈踪迹库 | 202011L | (C++23) | P0881R7 |
__cpp_lib_start_lifetime_as | 显式生存期管理(std::start_lifetime_as) | 202207L | (C++23) | P2590R2 |
__cpp_lib_starts_ends_with | 字符串前缀和后缀检查(用于 std::string 和 std::string_view 的 starts_with() 和 ends_with() ) | 201711L | (C++20) | P0457R2 |
__cpp_lib_stdatomic_h | 用于 C 原子操作的兼容头文件 | 202011L | (C++23) | P0943R6 |
__cpp_lib_string_contains | std::basic_string 和 std::basic_string_view 的 contains 函数 | 202011L | (C++23) | P1679R3 |
__cpp_lib_string_resize_and_overwrite | std::basic_string::resize_and_overwrite | 202110L | (C++23) | P1072R10 |
__cpp_lib_string_udls | 字符串类型的用户定义字面量 | 201304L | (C++14) | N3642 |
__cpp_lib_string_view | std::string_view | 201606L | (C++17) | P0220R1 P0254R2 |
常量表达式迭代器(ConstexprIterator) | 201803L | (C++20) | P0858R0 LWG3257 | |
拼接std::string 和 std::string_view | 202403L | (C++26) | P2591R5 | |
__cpp_lib_submdspan | std::submdspan | 202306L | (C++26) | P2630R4 |
有填充 mdspan 布局 | 202403L | P2642R6 | ||
__cpp_lib_syncbuf | 同步的带缓冲输出流(std::syncbuf、std::osyncstream)和操纵符 | 201803L | (C++20) | P0053R7 P0753R2 |
__cpp_lib_text_encoding | std::text_encoding | 202306L | (C++26) | P1885R12 |
__cpp_lib_three_way_comparison | 三路比较(库支持):向库添加三路比较 | 201907L | (C++20) | P0768R1 P1614R2 |
__cpp_lib_to_address | 将指针转换为原生指针的工具(std::to_address) | 201711L | (C++20) | P0653R2 |
__cpp_lib_to_array | std::to_array | 201907L | (C++20) | P0325R4 |
__cpp_lib_to_chars | 初等字符串转换 (std::to_chars 和 std::from_chars) | 201611L | (C++17) | P0067R5 P0682R1 LWG3137 |
测试 <charconv> 函数的成功或失败 | 202306L | (C++26) | P2497R0 | |
__cpp_lib_to_string | 使用 std::format 重定义 std::to_string | 202306L | (C++26) | P2587R3 |
__cpp_lib_to_underlying | std::to_underlying | 202102L | (C++23) | P1682R3 |
__cpp_lib_transformation_trait_aliases | 变换特征的别名模板 | 201304L | (C++14) | N3655 |
__cpp_lib_transparent_operators | 透明的运算符函数对象(std::less<> 等) | 201210L | (C++14) | N3421 |
透明的 std::owner_less(std::owner_less<void>) | 201510L | (C++17) | P0074R0 | |
__cpp_lib_trivially_relocatable | 可平凡重定位性的特征与操作 | 202502L | (C++26) | N2786R13 |
__cpp_lib_tuple_element_t | std::tuple_element_t | 201402L | (C++14) | N3887 |
__cpp_lib_tuple_like | std::tuple 和元组式对象(std::pair、std::array、std::subrange)间的兼容性 | 202207L | (C++23) | P2165R4 |
为 std::complex 添加元组协议 | 202311L | (C++26) | P2819R2 | |
__cpp_lib_tuples_by_type | 根据类型寻址元组 | 201304L | (C++14) | N3670 |
__cpp_lib_type_identity | std::type_identity | 201806L | (C++20) | P0887R1 |
__cpp_lib_type_trait_variable_templates | 类型特征变量模板(std::is_void_v 等) | 201510L | (C++17) | P0006R0 |
__cpp_lib_uncaught_exceptions | std::uncaught_exceptions | 201411L | (C++17) | N4259 |
__cpp_lib_unordered_map_try_emplace | std::unordered_map::try_emplace、std::unordered_map::insert_or_assign | 201411L | (C++17) | N4279 |
__cpp_lib_unreachable | std::unreachable | 202202L | (C++23) | P0627R6 |
__cpp_lib_unwrap_ref | std::unwrap_ref_decay 和 std::unwrap_reference | 201811L | (C++20) | P0318R1 LWG3348 |
__cpp_lib_variant | std::variant:C++17 的类型安全的联合体 | 201606L | (C++17) | P0088R3 P0393R3 P0032R3 |
用于 std::variant 派生类的 std::visit | 202102L | (C++23) (DR17) | P2162R2 | |
完全 constexpr 的 std::variant | 202106L | (C++23) (DR20) | P2231R1 | |
visit 成员 | 202306L | (C++26) | P2637R3 | |
__cpp_lib_void_t | std::void_t | 201411L | (C++17) | N3911 |
宏的总数量:283 |
[编辑]示例
[编辑]正常使用
#ifdef __has_include // 检查 __has_include 是否存在# if __has_include(<optional>) // 检查标准库# include <optional># elif __has_include(<experimental/optional>) // 检查实验版本# include <experimental/optional># elif __has_include(<boost/optional.hpp>) // 尝试外部库# include <boost/optional.hpp># else // 完全找不到# error "Missing <optional>"# endif#endif #ifdef __has_cpp_attribute // 检查 __has_cpp_attribute 是否存在# if __has_cpp_attribute(deprecated) // 检查一个属性# define DEPRECATED(msg) [[deprecated(msg)]]# endif#endif#ifndef DEPRECATED# define DEPRECATED(msg)#endif DEPRECATED("foo() has been deprecated")void foo(); #if __cpp_constexpr >= 201304 // 检查功能特性的指定版本# define CONSTEXPR constexpr#else# define CONSTEXPR inline#endif CONSTEXPR int bar(unsigned i){#ifdef __cpp_binary_literals // 检查功能特性是否存在unsigned mask1 =0b11000000;unsigned mask2 =0b00000111;#elseunsigned mask1 =0xA0;unsigned mask2 =0x07;#endifif(i & mask1)return1;if(i & mask2)return2;return0;} int main(){}
[编辑]编译器功能特性输出
以下(兼容 C++11)程序将转储 C++ 编译器的功能和属性。 注意 __has_cpp_attribute() 的使用并不遵从标准而是依赖于 gcc/clang 实现。
staticconstexprstruct choose_what_and_how_to_print {constexprstaticint longest_macro_name {45};constexprstaticbool titles =1;constexprstaticbool counters =1;constexprstaticbool attributes =1;constexprstaticbool standard_values =1;constexprstaticbool compiler_specific =1;constexprstaticbool core_features =1;constexprstaticbool lib_features =1;constexprstaticbool supported_features =1;constexprstaticbool unsupported_features =1;constexprstaticbool sort_by_date =0;constexprstaticbool separate_year_month =1;constexprstaticbool separated_revisions =1;constexprstaticbool latest_revisions =1;constexprstaticbool cxx98 =0;constexprstaticbool cxx11 =1;constexprstaticbool cxx14 =1;constexprstaticbool cxx17 =1;constexprstaticbool cxx20 =1;constexprstaticbool cxx23 =1;constexprstaticbool cxx26 =1;constexprstaticbool cxx29 =0;} print; #if __cplusplus < 201100# error "C++11 or better is required"#endif #include <algorithm>#include <cstdio>#include <cstring>#include <utility>#include <vector> #ifdef __has_include# if __has_include(<version>)# include <version># endif# if __has_include(<stdfloat>)# include <stdfloat># endif#endif // Expect a string that starts with 6-decimal-digits or with '_' (if unsupported)#define COMPILER_VALUE_INT(n) #n [0] == '_' ? 0 : \ (#n[5] - '0') + (#n[4] - '0') * 10 + (#n[3] - '0') * 100 + \ (#n[2] - '0') * 1000 + (#n[1] - '0') * 10000 + (#n[0] - '0') * 100000#define COMPILER_FEATURE_ENTRY(expect, name) { #name, COMPILER_VALUE_INT(name), expect }, #if defined(__has_cpp_attribute) && defined(__GNUG__)# define COMPILER_ATTRIBUTE(expect, name) { #name, __has_cpp_attribute(name), expect },#else# define COMPILER_ATTRIBUTE(expect, name) { #name, COMPILER_VALUE_INT(name), expect },#endif #define COMPILER_SPECIFIC_STRING(value) #value#define COMPILER_SPECIFIC_ENTRY(name) { #name, COMPILER_SPECIFIC_STRING(name) }, class CompilerFeature {charconst* name_;long data_;long std_;public:constexpr CompilerFeature(charconst* name, long data, long std): name_(name), data_(data), std_(std){}constexpr CompilerFeature(CompilerFeature const&)=default; CompilerFeature& operator=(CompilerFeature const&)=default;bool operator<(CompilerFeature const& rhs)const{returnstd::strcmp(name_, rhs.name_)<0;}bool operator==(CompilerFeature const& rhs)const{returnstd::strcmp(name_, rhs.name_)==0;}constexprbool supported()const{return data_ >= std_;}constexprbool maybe()const{return data_ >0;}constexprcharconst* name()const{return name_;}constexprlong std()const{return std_;}constexprlong data()const{return data_;}void data(long x){ data_ = x;}}; // Non-FTM macros, including implementation specific ones:static/*constexpr*/std::pair<constchar*, constchar*> compiler[]={ COMPILER_SPECIFIC_ENTRY(__cplusplus)//< not compiler specific, but useful :) COMPILER_SPECIFIC_ENTRY(__clang_major__) COMPILER_SPECIFIC_ENTRY(__clang_minor__) COMPILER_SPECIFIC_ENTRY(__clang_patchlevel__) COMPILER_SPECIFIC_ENTRY(__GNUG__) COMPILER_SPECIFIC_ENTRY(__GNUC_MINOR__) COMPILER_SPECIFIC_ENTRY(__GNUC_PATCHLEVEL__)// Optional <stdfloat> fixed width floating-point types (C++23) COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT16_T__) COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT32_T__) COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT64_T__) COMPILER_SPECIFIC_ENTRY(__STDCPP_FLOAT128_T__) COMPILER_SPECIFIC_ENTRY(__STDCPP_BFLOAT16_T__)// C23 => C++26 COMPILER_SPECIFIC_ENTRY(__STDC_ENDIAN_BIG__) COMPILER_SPECIFIC_ENTRY(__STDC_ENDIAN_LITTLE__) COMPILER_SPECIFIC_ENTRY(__STDC_ENDIAN_NATIVE__) COMPILER_SPECIFIC_ENTRY(__STDC_VERSION_STDBIT_H__) COMPILER_SPECIFIC_ENTRY(__STDC_VERSION_STDCKDINT_H__)// Add your favorite implementation specific macros... COMPILER_SPECIFIC_ENTRY(__STDCPP_DEFAULT_NEW_ALIGNMENT__) COMPILER_SPECIFIC_ENTRY(__STDCPP_THREADS__) COMPILER_SPECIFIC_ENTRY(__STDCPP_STRICT_POINTER_SAFETY__) COMPILER_SPECIFIC_ENTRY(__STDC_EMBED_NOT_FOUND__) COMPILER_SPECIFIC_ENTRY(__STDC_EMBED_FOUND__) COMPILER_SPECIFIC_ENTRY(__STDC_EMBED_EMPTY__) COMPILER_SPECIFIC_ENTRY(__STDC__) COMPILER_SPECIFIC_ENTRY(__STDC_VERSION__) COMPILER_SPECIFIC_ENTRY(__STDC_HOSTED__) COMPILER_SPECIFIC_ENTRY(__STDC_ISO_10646__) COMPILER_SPECIFIC_ENTRY(__STDC_MB_MIGHT_NEQ_WC__) COMPILER_SPECIFIC_ENTRY(__DATE__) COMPILER_SPECIFIC_ENTRY(__TIME__)}; staticconstexpr CompilerFeature cxx98_core[]={ COMPILER_FEATURE_ENTRY(199711L, __cpp_exceptions) COMPILER_FEATURE_ENTRY(199711L, __cpp_rtti)}; staticconstexpr CompilerFeature cxx11_core[]={ COMPILER_FEATURE_ENTRY(200704L, __cpp_alias_templates) COMPILER_FEATURE_ENTRY(200809L, __cpp_attributes) COMPILER_FEATURE_ENTRY(200704L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201711L, __cpp_constexpr_in_decltype) COMPILER_FEATURE_ENTRY(200707L, __cpp_decltype) COMPILER_FEATURE_ENTRY(200604L, __cpp_delegating_constructors) COMPILER_FEATURE_ENTRY(201511L, __cpp_inheriting_constructors) COMPILER_FEATURE_ENTRY(200806L, __cpp_initializer_lists) COMPILER_FEATURE_ENTRY(200907L, __cpp_lambdas) COMPILER_FEATURE_ENTRY(200809L, __cpp_nsdmi) COMPILER_FEATURE_ENTRY(200907L, __cpp_range_based_for) COMPILER_FEATURE_ENTRY(200710L, __cpp_raw_strings) COMPILER_FEATURE_ENTRY(200710L, __cpp_ref_qualifiers) COMPILER_FEATURE_ENTRY(200610L, __cpp_rvalue_references) COMPILER_FEATURE_ENTRY(200410L, __cpp_static_assert) COMPILER_FEATURE_ENTRY(200806L, __cpp_threadsafe_static_init) COMPILER_FEATURE_ENTRY(200704L, __cpp_unicode_characters) COMPILER_FEATURE_ENTRY(200710L, __cpp_unicode_literals) COMPILER_FEATURE_ENTRY(200809L, __cpp_user_defined_literals) COMPILER_FEATURE_ENTRY(200704L, __cpp_variadic_templates)}; staticconstexpr CompilerFeature cxx14_core[]={ COMPILER_FEATURE_ENTRY(201304L, __cpp_aggregate_nsdmi) COMPILER_FEATURE_ENTRY(201304L, __cpp_binary_literals) COMPILER_FEATURE_ENTRY(201304L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201304L, __cpp_decltype_auto) COMPILER_FEATURE_ENTRY(201304L, __cpp_generic_lambdas) COMPILER_FEATURE_ENTRY(201304L, __cpp_init_captures) COMPILER_FEATURE_ENTRY(201304L, __cpp_return_type_deduction) COMPILER_FEATURE_ENTRY(201309L, __cpp_sized_deallocation) COMPILER_FEATURE_ENTRY(201304L, __cpp_variable_templates)};staticconstexpr CompilerFeature cxx14_lib[]={ COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_chrono_udls) COMPILER_FEATURE_ENTRY(201309L, __cpp_lib_complex_udls) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_exchange_function) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_generic_associative_lookup) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_integer_sequence) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_integral_constant_callable) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_is_final) COMPILER_FEATURE_ENTRY(201309L, __cpp_lib_is_null_pointer) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_make_reverse_iterator) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_make_unique) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_null_iterators) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_quoted_string_io) COMPILER_FEATURE_ENTRY(201210L, __cpp_lib_result_of_sfinae) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_robust_nonmodifying_seq_ops) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_shared_timed_mutex) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_string_udls) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_transformation_trait_aliases) COMPILER_FEATURE_ENTRY(201210L, __cpp_lib_transparent_operators) COMPILER_FEATURE_ENTRY(201402L, __cpp_lib_tuple_element_t) COMPILER_FEATURE_ENTRY(201304L, __cpp_lib_tuples_by_type)}; staticconstexpr CompilerFeature cxx17_core[]={ COMPILER_FEATURE_ENTRY(201603L, __cpp_aggregate_bases) COMPILER_FEATURE_ENTRY(201606L, __cpp_aligned_new) COMPILER_FEATURE_ENTRY(201603L, __cpp_capture_star_this) COMPILER_FEATURE_ENTRY(201603L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201703L, __cpp_deduction_guides) COMPILER_FEATURE_ENTRY(201411L, __cpp_enumerator_attributes) COMPILER_FEATURE_ENTRY(201603L, __cpp_fold_expressions) COMPILER_FEATURE_ENTRY(201606L, __cpp_guaranteed_copy_elision) COMPILER_FEATURE_ENTRY(201603L, __cpp_hex_float) COMPILER_FEATURE_ENTRY(201606L, __cpp_if_constexpr) COMPILER_FEATURE_ENTRY(201606L, __cpp_inline_variables) COMPILER_FEATURE_ENTRY(201411L, __cpp_namespace_attributes) COMPILER_FEATURE_ENTRY(201510L, __cpp_noexcept_function_type) COMPILER_FEATURE_ENTRY(201411L, __cpp_nontype_template_args) COMPILER_FEATURE_ENTRY(201606L, __cpp_nontype_template_parameter_auto) COMPILER_FEATURE_ENTRY(201603L, __cpp_range_based_for) COMPILER_FEATURE_ENTRY(201411L, __cpp_static_assert) COMPILER_FEATURE_ENTRY(201606L, __cpp_structured_bindings) COMPILER_FEATURE_ENTRY(201611L, __cpp_template_template_args) COMPILER_FEATURE_ENTRY(201611L, __cpp_variadic_using)};staticconstexpr CompilerFeature cxx17_lib[]={ COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_addressof_constexpr) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_allocator_traits_is_always_equal) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_any) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_apply) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_array_constexpr) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_as_const) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_atomic_is_always_lock_free) COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_bool_constant) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_boyer_moore_searcher) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_byte) COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_chrono) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_clamp) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_enable_shared_from_this) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_execution) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_filesystem) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_gcd_lcm) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_hardware_interference_size) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_has_unique_object_representations) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_hypot) COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_incomplete_container_elements) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_invoke) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_is_aggregate) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_is_invocable) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_is_swappable) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_launder) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_logical_traits) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_make_from_tuple) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_map_try_emplace) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_math_special_functions) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_memory_resource) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_node_extract) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_nonmember_container_access) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_not_fn) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_optional) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_parallel_algorithm) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_raw_memory_algorithms) COMPILER_FEATURE_ENTRY(201603L, __cpp_lib_sample) COMPILER_FEATURE_ENTRY(201703L, __cpp_lib_scoped_lock) COMPILER_FEATURE_ENTRY(201505L, __cpp_lib_shared_mutex) COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_shared_ptr_arrays) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_shared_ptr_weak_type) COMPILER_FEATURE_ENTRY(201606L, __cpp_lib_string_view) COMPILER_FEATURE_ENTRY(201611L, __cpp_lib_to_chars) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_transparent_operators) COMPILER_FEATURE_ENTRY(201510L, __cpp_lib_type_trait_variable_templates) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_uncaught_exceptions) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_unordered_map_try_emplace) COMPILER_FEATURE_ENTRY(202102L, __cpp_lib_variant) COMPILER_FEATURE_ENTRY(201411L, __cpp_lib_void_t)}; staticconstexpr CompilerFeature cxx20_core[]={ COMPILER_FEATURE_ENTRY(201902L, __cpp_aggregate_paren_init) COMPILER_FEATURE_ENTRY(202207L, __cpp_char8_t) COMPILER_FEATURE_ENTRY(202002L, __cpp_concepts) COMPILER_FEATURE_ENTRY(201806L, __cpp_conditional_explicit) COMPILER_FEATURE_ENTRY(202211L, __cpp_consteval) COMPILER_FEATURE_ENTRY(202002L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(201907L, __cpp_constexpr_dynamic_alloc) COMPILER_FEATURE_ENTRY(201907L, __cpp_constinit) COMPILER_FEATURE_ENTRY(201907L, __cpp_deduction_guides) COMPILER_FEATURE_ENTRY(201707L, __cpp_designated_initializers) COMPILER_FEATURE_ENTRY(201707L, __cpp_generic_lambdas) COMPILER_FEATURE_ENTRY(201902L, __cpp_impl_coroutine) COMPILER_FEATURE_ENTRY(201806L, __cpp_impl_destroying_delete) COMPILER_FEATURE_ENTRY(201907L, __cpp_impl_three_way_comparison) COMPILER_FEATURE_ENTRY(201803L, __cpp_init_captures) COMPILER_FEATURE_ENTRY(201907L, __cpp_modules) COMPILER_FEATURE_ENTRY(201911L, __cpp_nontype_template_args) COMPILER_FEATURE_ENTRY(201907L, __cpp_using_enum)};staticconstexpr CompilerFeature cxx20_lib[]={ COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_array_constexpr) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_assume_aligned) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_flag_test) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_atomic_float) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_lock_free_type_aliases) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_atomic_ref) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_atomic_shared_ptr) COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_atomic_value_initialization) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_atomic_wait) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_barrier) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_bind_front) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_bit_cast) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_bitops) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_bounded_array_traits) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_char8_t) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_chrono) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_concepts) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_constexpr_algorithms) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_constexpr_complex) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_dynamic_alloc) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_functional) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_iterator) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_memory) COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_constexpr_numeric) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_string) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_string_view) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_tuple) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_constexpr_utility) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_constexpr_vector) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_coroutine) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_destroying_delete) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_endian) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_erase_if) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_execution) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_format) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_generic_unordered_lookup) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_int_pow2) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_integer_comparison_functions) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_interpolate) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_is_constant_evaluated) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_is_layout_compatible) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_is_nothrow_convertible) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_is_pointer_interconvertible) COMPILER_FEATURE_ENTRY(201911L, __cpp_lib_jthread) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_latch) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_list_remove_return_type) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_math_constants) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_optional) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_polymorphic_allocator) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_ranges) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_remove_cvref) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_semaphore) COMPILER_FEATURE_ENTRY(201707L, __cpp_lib_shared_ptr_arrays) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_shift) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_smart_ptr_for_overwrite) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_source_location) COMPILER_FEATURE_ENTRY(202002L, __cpp_lib_span) COMPILER_FEATURE_ENTRY(201902L, __cpp_lib_ssize) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_starts_ends_with) COMPILER_FEATURE_ENTRY(201803L, __cpp_lib_string_view) COMPILER_FEATURE_ENTRY(201803L, __cpp_lib_syncbuf) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_three_way_comparison) COMPILER_FEATURE_ENTRY(201711L, __cpp_lib_to_address) COMPILER_FEATURE_ENTRY(201907L, __cpp_lib_to_array) COMPILER_FEATURE_ENTRY(201806L, __cpp_lib_type_identity) COMPILER_FEATURE_ENTRY(201811L, __cpp_lib_unwrap_ref) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_variant)}; staticconstexpr CompilerFeature cxx23_core[]={ COMPILER_FEATURE_ENTRY(202110L, __cpp_auto_cast) COMPILER_FEATURE_ENTRY(202211L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(202110L, __cpp_explicit_this_parameter) COMPILER_FEATURE_ENTRY(202106L, __cpp_if_consteval) COMPILER_FEATURE_ENTRY(202207L, __cpp_implicit_move) COMPILER_FEATURE_ENTRY(202211L, __cpp_multidimensional_subscript) COMPILER_FEATURE_ENTRY(202207L, __cpp_named_character_escapes) COMPILER_FEATURE_ENTRY(202211L, __cpp_range_based_for) COMPILER_FEATURE_ENTRY(202011L, __cpp_size_t_suffix) COMPILER_FEATURE_ENTRY(202207L, __cpp_static_call_operator)};staticconstexpr CompilerFeature cxx23_lib[]={ COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_adaptor_iterator_pair_constructor) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_algorithm_iterator_requirements) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_allocate_at_least) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_associative_heterogeneous_erasure) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_barrier) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_bind_back) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_byteswap) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_common_reference) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_common_reference_wrapper) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_concepts) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_constexpr_bitset) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_constexpr_charconv) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_constexpr_cmath) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_constexpr_memory) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_constexpr_typeinfo) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_containers_ranges) COMPILER_FEATURE_ENTRY(202211L, __cpp_lib_expected) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_flat_map) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_flat_set) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_format) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_format_ranges) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_formatters) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_forward_like) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_generator) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_invoke_r) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ios_noreplace) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_is_implicit_lifetime) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_is_scoped_enum) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_mdspan) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_modules) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_move_iterator_concept) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_move_only_function) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_optional) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_out_ptr) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_print) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_ranges) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_as_const) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_as_rvalue) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_cartesian_product) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_chunk) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_chunk_by) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_contains) COMPILER_FEATURE_ENTRY(202302L, __cpp_lib_ranges_enumerate) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_find_last) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_fold) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_iota) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_join_with) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_repeat) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_slide) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_ranges_starts_ends_with) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_ranges_stride) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_ranges_to_container) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_ranges_zip) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_reference_from_temporary) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_shift) COMPILER_FEATURE_ENTRY(202106L, __cpp_lib_spanstream) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_stacktrace) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_start_lifetime_as) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_stdatomic_h) COMPILER_FEATURE_ENTRY(202011L, __cpp_lib_string_contains) COMPILER_FEATURE_ENTRY(202110L, __cpp_lib_string_resize_and_overwrite) COMPILER_FEATURE_ENTRY(202102L, __cpp_lib_to_underlying) COMPILER_FEATURE_ENTRY(202207L, __cpp_lib_tuple_like) COMPILER_FEATURE_ENTRY(202202L, __cpp_lib_unreachable)}; staticconstexpr CompilerFeature cxx26_core[]={//< Continue to Populate COMPILER_FEATURE_ENTRY(202406L, __cpp_constexpr) COMPILER_FEATURE_ENTRY(202411L, __cpp_constexpr_exceptions) COMPILER_FEATURE_ENTRY(202502L, __cpp_contracts) COMPILER_FEATURE_ENTRY(202403L, __cpp_deleted_function) COMPILER_FEATURE_ENTRY(202406L, __cpp_fold_expressions) COMPILER_FEATURE_ENTRY(202311L, __cpp_pack_indexing) COMPILER_FEATURE_ENTRY(202306L, __cpp_placeholder_variables) COMPILER_FEATURE_ENTRY(202502L, __cpp_pp_embed) COMPILER_FEATURE_ENTRY(202306L, __cpp_static_assert) COMPILER_FEATURE_ENTRY(202411L, __cpp_structured_bindings) COMPILER_FEATURE_ENTRY(202502L, __cpp_template_parameters) COMPILER_FEATURE_ENTRY(202502L, __cpp_trivial_relocatability) COMPILER_FEATURE_ENTRY(202502L, __cpp_trivial_union) COMPILER_FEATURE_ENTRY(202403L, __cpp_variadic_friend)};staticconstexpr CompilerFeature cxx26_lib[]={//< Continue to Populate COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_algorithm_default_value_type) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_aligned_accessor) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_associative_heterogeneous_insertion) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_atomic_min_max) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_atomic_ref) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bind_back) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bind_front) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_bitset) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_chrono) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_algorithms) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constexpr_atomic) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_cmath) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_constexpr_complex) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_deque) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_exceptions) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_flat_map) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_flat_set) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_forward_list) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_inplace_vector) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_list) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_map) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_constexpr_new) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_queue) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_set) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_stack) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_unordered_map) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_constexpr_unordered_set) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_constrained_equality) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_contracts) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_copyable_function) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_debugging) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_format_path) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_format_uchar) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_algorithm) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_array) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_char_traits) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_charconv) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_cstdlib) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_cstring) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_cwchar) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_errc) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_execution) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_expected) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_feature_test_macros) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_functional) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_iterator) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_mdspan) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_memory) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_numeric) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_operator_new) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_optional) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_freestanding_random) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_ranges) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_ratio) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_string_view) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_tuple) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_freestanding_utility) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_freestanding_variant) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_fstream_native_handle) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_function_ref) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_array) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_basic_string) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_basic_string_view) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_bitset) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_deque) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_expected) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_forward_list) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_inplace_vector) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_list) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_mdspan) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_optional) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_span) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_valarray) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hardened_vector) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_hazard_pointer) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_hive) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_indirect) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_inplace_vector) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_is_sufficiently_aligned) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_is_virtual_base_of) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_is_within_lifetime) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_linalg) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_mdspan) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_not_fn) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_optional_range_support) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_out_ptr) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_philox_engine) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_polymorphic) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_print) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_ranges) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_ranges_as_const) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_ranges_cache_latest) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_concat) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_ranges_generate_random) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_reserve_hint) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_ranges_to_input) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_ratio) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_raw_memory_algorithms) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_rcu) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_reference_wrapper) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_saturation_arithmetic) COMPILER_FEATURE_ENTRY(202406L, __cpp_lib_senders) COMPILER_FEATURE_ENTRY(202411L, __cpp_lib_simd) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_simd_complex) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_smart_ptr_owner_equality) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_span_initializer_list) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_sstream_from_string_view) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_string_view) COMPILER_FEATURE_ENTRY(202403L, __cpp_lib_submdspan) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_text_encoding) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_to_chars) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_to_string) COMPILER_FEATURE_ENTRY(202502L, __cpp_lib_trivially_relocatable) COMPILER_FEATURE_ENTRY(202311L, __cpp_lib_tuple_like) COMPILER_FEATURE_ENTRY(202306L, __cpp_lib_variant)}; staticconstexpr CompilerFeature cxx29_core[]={//< Continue to Populate COMPILER_FEATURE_ENTRY(202604L, __cpp_core_TODO)};staticconstexpr CompilerFeature cxx29_lib[]={//< Continue to Populate COMPILER_FEATURE_ENTRY(202604L, __cpp_lib_TODO)}; staticconstexpr CompilerFeature attributes[]={ COMPILER_ATTRIBUTE(202207L, assume) COMPILER_ATTRIBUTE(200809L, carries_dependency) COMPILER_ATTRIBUTE(201309L, deprecated) COMPILER_ATTRIBUTE(201603L, fallthrough) COMPILER_ATTRIBUTE(202403L, indeterminate) COMPILER_ATTRIBUTE(201803L, likely) COMPILER_ATTRIBUTE(201603L, maybe_unused) COMPILER_ATTRIBUTE(201803L, no_unique_address) COMPILER_ATTRIBUTE(201907L, nodiscard) COMPILER_ATTRIBUTE(200809L, noreturn) COMPILER_ATTRIBUTE(201803L, unlikely)}; inlinevoid show_compiler_specific_info(){std::printf("OTHER MACROS:\n");for(auto co : compiler)if(std::strcmp(co.first, co.second))std::printf("%*s %s\n", -print.longest_macro_name, co.first, co.second);} inlinevoid print_compiler_feature(const CompilerFeature& x){if(not ((print.supported_features and x.maybe()) or (print.unsupported_features and not x.maybe())))return;auto print_year_month =[](long n){returnstd::printf("%ld%s%02ld", n /100, print.separate_year_month?"-":"", n %100);};std::printf("%*s ", -print.longest_macro_name, x.name()); x.maybe()? print_year_month(x.data()):std::printf("------%s", print.separate_year_month?"-":"");if(print.standard_values)std::printf(" %c ", (x.supported()?(x.data()> x.std()?'>':'='):'<')), print_year_month(x.std());std::puts("");} template<class Container>inlinevoid show(charconst*const title, Container const& co){if(print.titles){std::printf("%-s (", title);if(print.counters){std::printf("%zd/", std::count_if(std::begin(co), std::end(co), [](CompilerFeature x){return x.supported();}));}std::printf("%td)\n", std::distance(std::begin(co), std::end(co)));}if(print.sort_by_date){std::vector<CompilerFeature> v(std::begin(co), std::end(co));std::stable_sort(v.begin(), v.end(), [](CompilerFeature const& lhs, CompilerFeature const& rhs){return lhs.data()< rhs.data();});std::for_each(v.cbegin(), v.cend(), print_compiler_feature);}elsestd::for_each(std::begin(co), std::end(co), print_compiler_feature);std::puts("");} inlinevoid show_latest(){auto latest_rev =[]()->int{return print.cxx29?29: print.cxx26?26: print.cxx23?23: print.cxx20?20: print.cxx17?17: print.cxx14?14: print.cxx11?11:98;};std::vector<CompilerFeature> latest;auto add =[&latest](CompilerFeature x){auto i =std::lower_bound(latest.begin(), latest.end(), x);if(i == latest.end() or not (*i == x)) latest.insert(i, x);elseif(i->data()< x.data()) i->data(x.data());};char text[64]; latest.reserve(512);// max macrosif(print.core_features){// preserve reverse revision insertion order!if(print.cxx29)std::for_each(std::begin(cxx29_core), std::end(cxx29_core), add);if(print.cxx26)std::for_each(std::begin(cxx26_core), std::end(cxx26_core), add);if(print.cxx23)std::for_each(std::begin(cxx23_core), std::end(cxx23_core), add);if(print.cxx20)std::for_each(std::begin(cxx20_core), std::end(cxx20_core), add);if(print.cxx17)std::for_each(std::begin(cxx17_core), std::end(cxx17_core), add);if(print.cxx14)std::for_each(std::begin(cxx14_core), std::end(cxx14_core), add);if(print.cxx11)std::for_each(std::begin(cxx11_core), std::end(cxx11_core), add);if(print.cxx98)std::for_each(std::begin(cxx98_core), std::end(cxx98_core), add);std::snprintf(text, sizeof text, "ALL CORE MACROS UP TO C++%02i", latest_rev()); show(text, latest);} latest.clear();if(print.lib_features){// preserve reverse revision insertion order!if(print.cxx29)std::for_each(std::begin(cxx29_lib), std::end(cxx29_lib), add);if(print.cxx26)std::for_each(std::begin(cxx26_lib), std::end(cxx26_lib), add);if(print.cxx23)std::for_each(std::begin(cxx23_lib), std::end(cxx23_lib), add);if(print.cxx20)std::for_each(std::begin(cxx20_lib), std::end(cxx20_lib), add);if(print.cxx17)std::for_each(std::begin(cxx17_lib), std::end(cxx17_lib), add);if(print.cxx14)std::for_each(std::begin(cxx14_lib), std::end(cxx14_lib), add);std::snprintf(text, sizeof text, "ALL LIB MACROS UP TO C++%02i", latest_rev()); show(text, latest);}} int main(){if(print.separated_revisions){if(print.cxx98 and print.core_features) show("C++98 CORE", cxx98_core);if(print.cxx11 and print.core_features) show("C++11 CORE", cxx11_core);if(print.cxx14 and print.core_features) show("C++14 CORE", cxx14_core);if(print.cxx14 and print.lib_features) show("C++14 LIB" , cxx14_lib);if(print.cxx17 and print.core_features) show("C++17 CORE", cxx17_core);if(print.cxx17 and print.lib_features) show("C++17 LIB" , cxx17_lib);if(print.cxx20 and print.core_features) show("C++20 CORE", cxx20_core);if(print.cxx20 and print.lib_features) show("C++20 LIB" , cxx20_lib);if(print.cxx23 and print.core_features) show("C++23 CORE", cxx23_core);if(print.cxx23 and print.lib_features) show("C++23 LIB" , cxx23_lib);if(print.cxx26 and print.core_features) show("C++26 CORE", cxx26_core);if(print.cxx26 and print.lib_features) show("C++26 LIB" , cxx26_lib);if(print.cxx29 and print.core_features) show("C++29 CORE", cxx29_core);if(print.cxx29 and print.lib_features) show("C++29 LIB" , cxx29_lib);}if(print.latest_revisions) show_latest();if(print.attributes) show("ATTRIBUTES", attributes);if(print.compiler_specific) show_compiler_specific_info();}
可能的输出:
C++11 CORE (20/20) __cpp_alias_templates 2007-04 = 2007-04 __cpp_attributes 2008-09 = 2008-09 __cpp_constexpr 2022-11 > 2007-04 __cpp_constexpr_in_decltype 2017-11 = 2017-11 ... truncated ... C++14 CORE (9/9) __cpp_aggregate_nsdmi 2013-04 = 2013-04 __cpp_binary_literals 2013-04 = 2013-04 __cpp_constexpr 2022-11 > 2013-04 ... truncated ... C++14 LIB (20/20) __cpp_lib_chrono_udls 2013-04 = 2013-04 __cpp_lib_complex_udls 2013-09 = 2013-09 __cpp_lib_exchange_function 2013-04 = 2013-04 ... truncated ... ... truncated ... C++23 LIB (43/64) __cpp_lib_adaptor_iterator_pair_constructor 2021-06 = 2021-06 __cpp_lib_algorithm_iterator_requirements ------- < 2022-07 __cpp_lib_allocate_at_least ------- < 2023-02 __cpp_lib_associative_heterogeneous_erasure ------- < 2021-10 __cpp_lib_barrier 2019-07 < 2023-02 ... truncated ... ALL CORE MACROS UP TO C++26 (60/76) __cpp_aggregate_bases 2016-03 = 2016-03 __cpp_aggregate_nsdmi 2013-04 = 2013-04 __cpp_aggregate_paren_init 2019-02 = 2019-02 __cpp_alias_templates 2007-04 = 2007-04 ... truncated ... ALL LIB MACROS UP TO C++26 (158/282) __cpp_lib_adaptor_iterator_pair_constructor 2021-06 = 2021-06 __cpp_lib_addressof_constexpr 2016-03 = 2016-03 __cpp_lib_algorithm_iterator_requirements ------- < 2022-07 __cpp_lib_allocate_at_least ------- < 2023-02 __cpp_lib_allocator_traits_is_always_equal 2014-11 = 2014-11 ... truncated ... ATTRIBUTES (9/11) assume 2022-07 = 2022-07 carries_dependency ------- < 2008-09 deprecated 2013-09 = 2013-09 fallthrough 2016-03 = 2016-03 ... truncated ... OTHER MACROS: __cplusplus 202302L __GNUG__ 14 __GNUC_MINOR__ 2 __GNUC_PATCHLEVEL__ 0 __STDCPP_FLOAT16_T__ 1 __STDCPP_FLOAT32_T__ 1 ... truncated ...
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P2552R3 | C++20 | __has_cpp_attribute 对于标准属性必须展开成非零值 | 可以展开成 0 |
[编辑]参阅
库功能特性测试宏(C++20) | 在标头 <version> 定义 |
预定义宏符号 | |
宏符号索引 |
[编辑]外部链接
1. | 特性测试推荐的官方文档 |
2. | 试出编译器特性的源码 |