Espacios de nombres
Variantes
Acciones

Prueba de características (C++20)

De cppreference.com
< cpp

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.

Contenido

[editar] Atributos

__has_cpp_attribute( símbolo-de-atributo )

Comprueba la presencia de un atributo denominado por símbolo-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.

símbolo-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)
noreturn [[noreturn]] 200809L (C++11)
unlikely [[unlikely]] 201803L (C++20)

[editar] 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 Extensión a incialización de agregado 201603L (C++17)
__cpp_aggregate_nsdmi Inicializadores de miembros y agregados 201304L (C++14)
__cpp_aggregate_paren_init Inicialización de agregado en la forma de inicialización directa 201902L (C++20)
__cpp_alias_templates Alias de plantillas 200704L (C++11)
__cpp_aligned_new Asignación de memoria dinámica para datos sobrealineados 201606L (C++17)
__cpp_attributes Atributos 200809L (C++11)
__cpp_binary_literals Literales binarios en el lenguaje central de C++ 201304L (C++14)
__cpp_capture_star_this Captura de lambda de *this por valor como [=,*this] 201603L (C++17)
__cpp_char8_t char8_t 201811L (C++20)
__cpp_conditional_explicit explicit(bool) 201806L (C++20)
__cpp_constexpr constexpr 200704L (C++11)
Relajamiento de restricciones en funciones constexpr / funciones miembro constexpr y const implícito 201304L (C++14)
Lambda constexpr 201603L (C++17)
Inicialización por defecto trivial y Declaración asm en funciones constexpr 201907L (C++20)
__cpp_coroutines Corrutinas 201902L (C++20)
__cpp_decltype decltype 200707L (C++11)
__cpp_decltype_auto Deducción del tipo de retorno para funciones normales 201304L (C++14)
__cpp_deduction_guides Deducción de argumentos de plantillas para plantillas de clase 201703L (C++17)
__cpp_delegating_constructors Constructores delegadores 200604L (C++11)
__cpp_enumerator_attributes Atributos para enumeradores 201411L (C++17)
__cpp_fold_expressions Expresiones de pliegue 201603L (C++17)
__cpp_generic_lambdas Expresiones lambda genéricas (polimórficas) 201304L (C++14)
__cpp_guaranteed_copy_elision Elisión de copia obligatoria mediante categorías de valor simplificadas 201606L (C++17)
__cpp_hex_float Literales hexadecimales de punto flotante 201603L (C++17)
__cpp_if_constexpr If en tiempo de compilación (constexpr if) 201606L (C++17)
__cpp_impl_destroying_delete Operador delete destructor (compiler support) 201806L (C++20)
__cpp_impl_three_way_comparison Comparación de tres vías (compiler support) 201711L (C++20)
__cpp_inheriting_constructors Constructores herederos 200802L (C++11)
Reformular constructores herederos 201511L (C++17)
__cpp_init_captures Captura generalizada de lambdas 201304L (C++14)
__cpp_initializer_lists Listas de inicializadores 200806L (C++11)
__cpp_inline_variables Variables en línea 201606L (C++17)
__cpp_lambdas Expresiones lambda 200907L (C++11)
__cpp_namespace_attributes Atributos para espacios de nombre 201411L (C++17)
__cpp_noexcept_function_type Hacer que las especificaciones de excepciones sean parte del sistema 201510L (C++17)
__cpp_nontype_template_args Permitir evaluación constante para todos los argumentos de plantilla de no tipo (sin tipo) 201411L (C++17)
__cpp_nontype_template_parameter_auto Declarar parámetros de plantilla de no tipo (sin tipo) with auto 201606L (C++17)
__cpp_nontype_template_parameter_class Tipos de clase en parámetros de plantilla de no tipo (sin tipo) 201806L (C++20)
__cpp_nsdmi Inicializadores de datos miembro no estáticos 200809L (C++11)
__cpp_range_based_for Bucle for basado en rango 200907L (C++11)
Bucle for basado en rango generalizado 201603L (C++17)
__cpp_raw_strings Literales de cadena sin formato 200710L (C++11)
__cpp_ref_qualifiers Calificadores de referencia 200710L (C++11)
__cpp_return_type_deduction Deducción del tipo de retorno para funciones normales 201304L (C++14)
__cpp_rvalue_references Referencia rvalue 200610L (C++11)
__cpp_sized_deallocation Desasignación con tamaño 201309L (C++14)
__cpp_static_assert Aserción estática (static_assert) 200410L (C++11)
Aserción estática (static_assert) extendida 201411L (C++17)
__cpp_structured_bindings Vínculos estructurados 201606L (C++17)
__cpp_template_template_args Coincidencia de argumentos de plantilla de plantilla 201611L (C++17)
__cpp_threadsafe_static_init Inicialización dinámica y destrucción con concurrencia 200806L (C++11)
__cpp_unicode_characters Nuevos tipos de carácter (char16_t and char32_t) 200704L (C++11)
__cpp_unicode_literals Literales de cadena Unicode 200710L (C++11)
__cpp_user_defined_literals Literales definidos por el usuario 200809L (C++11)
__cpp_variable_templates Plantillas de variable 201304L (C++14)
__cpp_variadic_templates Plantillas variádicas 200704L (C++11)
__cpp_variadic_using Expansiones de paquete en las declaraciones using 201611L (C++17)

[editar] Características de la biblioteca

Las siguientes macros se definen si se incluye el archivo de encabezado <version> o cualquiera de los archivos de encabezado correspondientes en la tabla a continuació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 Encabezado Estándar
__cpp_lib_addressof_constexpr constexpr std::addressof 201603L <memory> (C++17)
__cpp_lib_allocator_traits_is_always_equal std::allocator_traits::is_always_equal 201411L <memory> <scoped_allocator> <string> <deque> <forward_list> <list> <vector> <map> <set> <unordered_map> <unordered_set> (C++17)
__cpp_lib_any std::any 201606L <any> (C++17)
__cpp_lib_apply std::apply 201603L <tuple> (C++17)
__cpp_lib_array_constexpr Añadir modificadores constexpr a std::reverse_iterator, std::move_iterator, std::array y acceso a rango 201603L <iterator> <array> (C++17)
__cpp_lib_as_const std::as_const 201510L <utility> (C++17)
__cpp_lib_atomic_is_always_lock_free constexpr atomic<T>::is_always_lock_free 201603L <atomic> (C++17)
__cpp_lib_atomic_ref std::atomic_ref 201806L <atomic> (C++20)
__cpp_lib_bind_front std::bind_front 201811L <functional> (C++20)
__cpp_lib_bit_cast std::bit_cast 201806L <bit> (C++20)
__cpp_lib_bool_constant std::bool_constant 201505L <type_traits> (C++17)
__cpp_lib_bounded_array_traits std::is_bounded_array, std::is_unbounded_array 201902L <type_traits> (C++20)
__cpp_lib_boyer_moore_searcher Buscadores 201603L <functional> (C++17)
__cpp_lib_byte Una definición del tipo byte 201603L <cstddef> (C++17)
__cpp_lib_char8_t Soporte de biblioteca para char8_t 201811L <atomic> <filesystem> <istream> <limits> <locale> <ostream> <string> <string_view> (C++20)
__cpp_lib_chrono Funciones de redondeo para std::chrono::duration y std::chrono::time_point 201510L <chrono> (C++17)
Hacer todas la funciones miembro de std::chrono::duration y std::chrono::time_point constexpr 201611L <chrono> (C++17)
__cpp_lib_chrono_udls Literales definidos por el usuario para tipos de tiempo 201304L <chrono> (C++14)
__cpp_lib_clamp Un algoritmo para "sujetar" un valor entre un par de valores límite (std::clamp) 201603L <algorithm> (C++17)
__cpp_lib_complex_udls Literales definidos por el usuario para std::complex 201309L <complex> (C++14)
__cpp_lib_concepts Conceptos de la biblioteca estándar 201806L <concepts> (C++20)
__cpp_lib_constexpr Constexpr para facilidades misceláneas 201811L Cualquier archivo de encabezado de la biblioteca estándar de C++ excepto <*.h> (C++20)
__cpp_lib_constexpr_swap_algorithms Constexpr para swap y funciones relacionadas con intercambio 201806L <algorithm> (C++20)
__cpp_lib_destroying_delete Operador delete destructor (soporte de biblioteca) 201806L <new> (C++20)
__cpp_lib_enable_shared_from_this Rehabilitar shared_from_this 201603L <memory> (C++17)
__cpp_lib_erase_if Borrado uniforme de contenedores 201811L <string> <deque> <forward_list> <list> <vector> <map> <set> <unordered_map> <unordered_set> (C++20)
__cpp_lib_exchange_function Función de utilidad exchange() 201304L <utility> (C++14)
__cpp_lib_execution Políticas de ejecución 201603L <execution> (C++17)
std::execution::unsequenced_policy 201902L <execution> (C++20)
__cpp_lib_filesystem Biblioteca del sistema de archivos 201703L <filesystem> (C++17)
__cpp_lib_gcd_lcm std::gcd, std::lcm 201606L <numeric> (C++17)
__cpp_lib_generic_associative_lookup Añadir búsqueda de comparación heterogénea a los contenedores asociativos 201304L <map> <set> (C++14)
__cpp_lib_generic_unordered_lookup Añadir búsqueda de comparación heterogénea a los contenedores asociativos no ordenados 201811L <unordered_map> <unordered_set> (C++20)
__cpp_lib_hardware_interference_size constexpr std::hardware_{constructive, destructive}_interference_size 201703L <new> (C++17)
__cpp_lib_has_unique_object_representations std::has_unique_object_representations 201606L <type_traits> (C++17)
__cpp_lib_hypot Sobrecarga de 3 argumentos de std::hypot 201603L <cmath> (C++17)
__cpp_lib_incomplete_container_elements Soporte mínimo de tipos incompletos para los contenedores estándar 201505L <forward_list> <list> <vector> (C++17)
__cpp_lib_integer_sequence Secuencias de enteros en tiempo de compilación 201304L <utility> (C++14)
__cpp_lib_interpolate std::lerp(), std::midpoint() 201902L <cmath> <numeric> (C++20)
__cpp_lib_integral_constant_callable std::integral_constant::operator() 201304L <type_traits> (C++14)
__cpp_lib_invoke Plantilla de función std::invoke 201411L <functional> (C++17)
__cpp_lib_is_aggregate Rasgo de tipo std::is_aggregate 201703L <type_traits> (C++17)
__cpp_lib_is_constant_evaluated Detección de contexto evaluado constante (std::is_constant_evaluated()) 201811L <type_traits> (C++20)
__cpp_lib_is_final std::is_final 201402L <type_traits> (C++14)
__cpp_lib_is_invocable std::is_invocable, std::invoke_result 201703L <type_traits> (C++17)
__cpp_lib_is_null_pointer std::is_null_pointer 201309L <type_traits> (C++14)
__cpp_lib_is_swappable Rasgos de intercambio [nothrow-] 201603L <type_traits> (C++17)
__cpp_lib_launder Problema central 1776: Reemplazo de objetos de clase que contienen miembros de referencia (std::launder) 201606L <new> (C++17)
__cpp_lib_list_remove_return_type Cambiar el tipo de retorno de los miembros remove(), remove_if() y unique() de std::forward_list y std::list 201806L <forward_list> <list> (C++20)
__cpp_lib_logical_traits Rasgos de tipos de operadores lógicos 201510L <type_traits> (C++17)
__cpp_lib_make_from_tuple std::make_from_tuple: aplicar para construcción 201606L <tuple> (C++17)
__cpp_lib_make_reverse_iterator std::make_reverse_iterator 201402L <iterator> (C++14)
__cpp_lib_make_unique std::make_unique 201304L <memory> (C++14)
__cpp_lib_map_try_emplace std::map::try_emplace, std::map::insert_or_assign 201411L <map> (C++17)
__cpp_lib_math_special_functions Funciones matemáticas especiales para C++17 201603L <cmath> (C++17)
__cpp_lib_memory_resource std::pmr::memory_resource 201603L <memory_resource> (C++17)
__cpp_lib_node_extract Unir mapas y conjuntos (std::map::extract, std::map::merge, std::map::insert(node_type), etc) 201606L <map> <set> <unordered_map> <unordered_set> (C++17)
__cpp_lib_nonmember_container_access size() no miembro y más (acceso uniforme a contenedores) 201411L <iterator> <array> <deque> <forward_list> <list> <map> <regex> <set> <string> <unordered_map> <unordered_set> <vector> (C++17)
__cpp_lib_not_fn std::not_fn 201603L <functional> (C++17)
__cpp_lib_null_iterators LegacyForwardIterator nulos 201304L <iterator> (C++14)
__cpp_lib_optional std::optional 201606L <optional> (C++17)
__cpp_lib_parallel_algorithm Adoptar la Especificación Técnica de Paralelismo para C++17 201603L <algorithm> <numeric> (C++17)
__cpp_lib_quoted_string_io std::quoted 201304L <iomanip> (C++14)
__cpp_lib_ranges Biblioteca de rangos y algoritmos constreñidos 201811L <algorithm> <functional> <iterator> <memory> <ranges> (C++20)
__cpp_lib_raw_memory_algorithms Extender herramientas de administración de memoria 201606L <memory> (C++17)
__cpp_lib_result_of_sfinae std::result_of y SFINAE 201210L <functional> <type_traits> (C++14)
__cpp_lib_robust_nonmodifying_seq_ops Hacer operaciones de secuencias no-modificadoras más robustas (sobrecargas de dos rangos para std::mismatch, std::equal y std::is_permutation) 201304L <algorithm> (C++14)
__cpp_lib_sample std::sample 201603L <algorithm> (C++17)
__cpp_lib_scoped_lock std::lock_guard variádico (std::scoped_lock) 201703L <mutex> (C++17)
__cpp_lib_shared_mutex std::shared_mutex (no temporizado) 201505L <shared_mutex> (C++17)
__cpp_lib_shared_ptr_arrays std::shared_ptr<T[]> 201611L <memory> (C++17)
__cpp_lib_shared_ptr_weak_type shared_ptr::weak_type 201606L <memory> (C++17)
__cpp_lib_shared_timed_mutex Renombrar shared_mutex a shared_timed_mutex 201402L <shared_mutex> (C++14)
__cpp_lib_string_udls Literales definidos por el usuario para tipos de cadena 201304L <string> (C++14)
__cpp_lib_string_view std::string_view 201606L <string> <string_view> (C++17)
__cpp_lib_three_way_comparison Comparación de tres vías (soporte de biblioteca) 201711L <compare> (C++20)
__cpp_lib_to_chars Conversiones de cadena elementales (std::to_chars, std::from_chars) 201611L <charconv> (C++17)
__cpp_lib_transformation_trait_aliases Reducción de rasgos de transformación (TransformationTraits) 201304L <type_traits> (C++14)
__cpp_lib_transparent_operators Objetos función de operador transparentes (std::less<> et al) 201210L <functional> (C++14)
Hacer std::owner_less más flexible (std::owner_less<void>) 201510L <memory> <functional> (C++17)
__cpp_lib_tuple_element_t std::tuple_element_t 201402L <tuple> (C++14)
__cpp_lib_tuples_by_type Abordando tuplas por tipo 201304L <utility> <tuple> (C++14)
__cpp_lib_type_trait_variable_templates Plantillas de variable de rasgos de tipo (std::is_void_v, etc) 201510L <type_traits> (C++17)
__cpp_lib_uncaught_exceptions std::uncaught_exceptions 201411L <exception> (C++17)
__cpp_lib_unordered_map_try_emplace std::unordered_map::try_emplace, std::unordered_map::insert_or_assign 201411L <unordered_map> (C++17)
__cpp_lib_variant std::variant: una unión de tipo seguro para C++17 201606L <variant> (C++17)
__cpp_lib_void_t std::void_t 201411L <type_traits> (C++17)

[editar] Ejemplo

#ifdef __has_include                           // Buscar si __has_include está presente
#  if __has_include(<optional>)                // Buscar una biblioteca estándar
#    include <optional>
#  elif __has_include(<experimental/optional>) // Buscar una versión experimental
#    include <experimental/optional>
#  elif __has_include(<boost/optional.hpp>)    // Tratar con una biblioteca externa
#    include <boost/optional.hpp>
#  else                                        // No se encontró en lo absoluto
#     error "Missing <optional>"
#  endif
#endif
 
#ifdef __has_cpp_attribute                      // Buscar si if __has_cpp_attribute está presente
#  if __has_cpp_attribute(deprecated)           // Buscar un atributo
#    define DEPRECATED(msg) [[deprecated(msg)]]
#  endif
#endif
#ifndef DEPRECATED
#    define DEPRECATED(msg)
#endif
 
DEPRECATED("foo() está en desuso") void foo();
 
#if __cpp_constexpr >= 201304                   // Buscar una versión específica de una característica
#  define CONSTEXPR constexpr
#else
#  define CONSTEXPR inline
#endif
 
CONSTEXPR int bar(unsigned i)
{
#if __cpp_binary_literals                       // Buscar la presencia de una característica
    unsigned mask1 = 0b11000000;
    unsigned mask2 = 0b00000111;
#else
    unsigned mask1 = 0xC0;
    unsigned mask2 = 0x07;
#endif
    if ( i & mask1 )
        return 1;
    if ( i & mask2 )
        return 2;
    return 0;
}
 
int main()
{
}


[editar] Véase también