功能特性测试 (C++20)
来自cppreference.com
< cpp
标准中为 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
|
具有 |