Feature testing (since C++20)
The standard defines a set of preprocessor macros corresponding to C++ language and library features introduced in C++11 or later. They are intended as a simple and portable way to detect the presence of said features.
Attributes
__has_cpp_attribute( attribute-token )
|
|||||||||
Checks for the support of an attribute named by attribute-token (after macro expansion).
For each standard attribute, it is implementation-defined whether __has_cpp_attribute expands to the value given in the table below (which is the year and month in which the attribute was added to the working draft) or 0. It will expand to given value in the table if and only if the standard attribute causes the implementation to behave as recommended (issuing diagnostic messages, affecting class layout, etc.).
The presence of vendor-specific attributes is determined by a non-zero value.
__has_cpp_attribute can be expanded in the expression of
#if and
#elif.
It is treated as a defined macro by
#ifdef,
#ifndef,
#elifdef,
#elifndef(since C++23) and defined but cannot be used anywhere else.
| attribute-token | Attribute | Value | Std | Paper(s) |
|---|---|---|---|---|
assume
|
[[assume]]
|
202207L
|
(C++23) | P1774R8 |
carries_dependency
|
[[carries_dependency]]
|
200809L
|
(C++11) (until 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]] with reason
|
201907L
|
(C++20) | P1301R4 | |
noreturn
|
[[noreturn]]
|
200809L
|
(C++11) | N2761 |
unlikely
|
[[unlikely]]
|
201803L
|
(C++20) | P0479R5 |
| Total number of attributes: 11 | ||||
Language features
The following macros can be used to detect whether a language feature is implemented by the current implementation. They are predefined in every translation unit.
Each macro expands to an integer literal corresponding to the year and month when the corresponding feature has been included in the working draft. When a feature changes significantly, the macro will be updated accordingly.
| Macro name | Feature | Value | Std | Paper(s) |
|---|---|---|---|---|
__cpp_aggregate_
|
Aggregate classes with base classes | 201603L
|
(C++17) | P0017R1 |
__cpp_aggregate_
|
Aggregate classes with default member initializers | 201304L
|
(C++14) | N3653 |
__cpp_aggregate_
|
Aggregate initialization in the form of direct initialization | 201902L
|
(C++20) | P0960R3 |
__cpp_alias_templates
|
Alias templates | 200704L
|
(C++11) | N2258 |
__cpp_aligned_new
|
Dynamic memory allocation for over-aligned data | 201606L
|
(C++17) | P0035R4 |
__cpp_attributes
|
Attributes | 200809L
|
(C++11) | N2761 |
__cpp_auto_cast
|
Casting an expression to a prvalue ( |