Prueba de características (C++20)
El estándar define un conjunto de macros de preprocesador correspondiente al lenguaje C++ y las características de la biblioteca introducidas en C++11 o posterior. Pretenden ser una forma simple y portátil de detectar la presencia de dichas características.
Atributos
__has_cpp_attribute( token-de-atributo )
|
|||||||||
Verifica la presencia de un atributo denominado por token-de-atributo (después de la expansión de macro).
Para los atributos estándar, se expandirá al año y mes en que el atributo se agregó al borrador de trabajo (consulta la tabla a continuación), la presencia de atributos específicos del proveedor se determina por un valor distinto de cero.
__has_cpp_attribute se puede expandir en la expresión de
#if y
#elif.
Se trata como una macro definida por
#ifdef,
#ifndef y defined, pero no se puede usar en ninguna otra parte.
| token-de-atributo | Atributo | Valor | Estándar |
|---|---|---|---|
carries_dependency
|
[[carries_dependency]]
|
200809L
|
(C++11) |
deprecated
|
[[deprecated]]
|
201309L
|
(C++14) |
fallthrough
|
[[fallthrough]]
|
201603L
|
(C++17) |
likely
|
[[likely]]
|
201803L
|
(C++20) |
maybe_unused
|
[[maybe_unused]]
|
201603L
|
(C++17) |
no_unique_address
|
[[no_unique_address]]
|
201803L
|
(C++20) |
nodiscard
|
[[nodiscard]]
|
201603L
|
(C++17) |
201907L
|
(C++20) | ||
noreturn
|
[[noreturn]]
|
200809L
|
(C++11) |
unlikely
|
[[unlikely]]
|
201803L
|
(C++20) |
Características del lenguaje
Las siguientes macros están predefinidas en cada unidad de traducción. Cada macro se expande a un literal entero correspondiente al año y mes cuando la característica correspondiente se incluyó en el borrador de trabajo.
Cuando una característica cambia significativamente, la macro se actualizará en consecuencia.
| Nombre de la macro | Característica | Valor | Estándar |
|---|---|---|---|
__cpp_aggregate_bases |
Clases de agregado con clases base | 201603L |
(C++17) |
__cpp_aggregate_nsdmi |
Clases de agregado con inicializadores de miembros por defecto | 201304L |
(C++14) |
__cpp_aggregate_paren_init |
Inicialización de agregados en la forma de inicialización directa | 201902L |
(C++20) |
__cpp_alias_templates |
Plantillas de alias | 200704L |
(C++11) |