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( 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)

[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 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)
__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 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_concepts Conceptos 201907L (C++20)
Funciones miembro especiales triviales condicionales 202002L (C++20)
__cpp_conditional_explicit explicit(bool) 201806L (C++20)
__cpp_consteval Funciones inmediatas 201811L (C++20)
__cpp_constexpr constexpr 200704L (C++11)
constexpr relajado, no-const métodos constexpr 201304L (C++14)
Lambda constexpr 201603L (C++17)
Inicialización por defecto trivial y declaración asm en funciones constexpr 201907L (C++20)
Cambiar el miembro activo de una unión en una evaluación constante 202002L (C++20)
Variables no literal, etiquetas e instrucciones goto en funciones constexpr 202110L (C++23)
__cpp_constexpr_dynamic_alloc Operaciones para duración de almacenamiento dinámico en funciones constexpr 201907L (C++20)
__cpp_constexpr_in_decltype Generación de definiciones de funciones y variables cuando es necesario para evaluación constante 201711L (C++11)(DR)
__cpp_constinit constinit 201907L (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 plantilla para plantillas de clase 201703L (C++17)
CTAD para agregados y alias 201907L (C++20)
__cpp_delegating_constructors Constructores delegadores 200604L (C++11)
__cpp_designated_initializers Inicializador designado 201707L (C++20)
__cpp_enumerator_attributes Atributos para enumeradores 201411L (C++17)
__cpp_explicit_this_parameter Parámetro de objeto explícito 202110L (C++23)
__cpp_fold_expressions Expresiones de pliegue 201603L (C++17)
__cpp_generic_lambdas Expresiones lambda genéricas 201304L (C++14)
Lista de parámetros de plantilla explícitos para lambdas genéricas 201707L (C++20)
__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_consteval consteval if 202106L (C++23)
__cpp_if_constexpr constexpr if 201606L (C++17)
__cpp_impl_coroutine Corrutinas (apoyo del compilador) 201902L (C++20)
__cpp_impl_destroying_delete Operador delete de destrucción (apoyo del compilador) 201806L (C++20)
__cpp_impl_three_way_comparison Comparación de tres vías (apoyo del compilador) 201711L (C++20)
__cpp_inheriting_constructors Constructores herederos 200802L (C++11)
Reformular constructores herederos 201511L (C++11)(DR)
__cpp_init_captures Captura generalizada de lambdas 201304L (C++14)
Admitir la expansión de paquetes en captura generalizada de lambdas 201803L (C++20)
__cpp_initializer_lists Inicialización por lista y std::initializer_list 200806L (C++11)
__cpp_inline_variables Variables en línea 201606L (C++17)
__cpp_lambdas Expresiones lambda 200907L (C++11)
__cpp_modules Módulos 201907L (C++20)
__cpp_multidimensional_subscript Operador de índice multidimensional 202110L (C++23)
__cpp_namespace_attributes Atributos para espacios de nombres 201411L (C++17)
__cpp_noexcept_function_type Hacer que las especificaciones de excepciones sean parte del sistema de tipos 201510L (C++17)
__cpp_nontype_template_args Admitir la evaluación constante para todos los argumentos de plantilla de no tipo 201411L (C++17)
Tipos clase y tipos de punto flotante en los parámetros de plantilla de no tipo 201911L (C++20)
__cpp_nontype_template_parameter_auto Declarar los parámetros de plantilla de no tipo con auto 201606L (C++17)
__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 con distintos tipos begin/end 201603L (C++17)
__cpp_raw_strings Literales de cadena sin formato 200710L (C++11)
__cpp_ref_qualifiers Calificadores de referencias 200710L (C++11)
__cpp_return_type_deduction Deducción del tipo de retorno para funciones normales 201304L (C++14)
__cpp_rvalue_references Referencia r-valor 200610L (C++11)
__cpp_size_t_suffix Sufijos de literales para size_t y su versión con signo 202011L (C++23)
__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) con un solo argumento 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 y 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_using_enum using enum 201907L (C++20)
__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_adaptor_iterator_pair_constructor Constructores de iteradores con un std::pair para std::stack y std::queue 202106L <stack> <queue> (C++23)
__cpp_lib_addressof_constexpr std::addressof constexpr 201603L <memory> (C++17)
__cpp_lib_allocate_at_least std::allocate_at_least etc. 202106L <memory> (C++23)
__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)
ConstexprIterator; comparación constexpr para std::array; constexpr misceláneos (std::array::fill et al.) 201811L <iterator> <array> (C++20)
__cpp_lib_as_const std::as_const 201510L <utility> (C++17)
__cpp_lib_associative_heterogeneous_erasure Borrado heterogéneo en los contenedores asociativos y los contenedores asociativos no ordenados 202110L <map> <set> <unordered_map> <unordered_set> (C++23)
__cpp_lib_assume_aligned std::assume_aligned 201811L <memory> (C++20)
__cpp_lib_atomic_flag_test std::atomic_flag::test 201907L <atomic> (C++20)
__cpp_lib_atomic_float Atómico de punto flotante 201711L <atomic> (C++20)
__cpp_lib_atomic_is_always_lock_free constexpr atomic<T>::is_always_lock_free 201603L <atomic> (C++17)
__cpp_lib_atomic_lock_free_type_aliases Tipos enteros sin bloqueo atómico (std::atomic_signed_lock_free, std::atomic_unsigned_lock_free) 201907L <atomic> (C++20)
__cpp_lib_atomic_ref std::atomic_ref 201806L <atomic> (C++20)
__cpp_lib_atomic_shared_ptr std::atomic<std::shared_ptr> 201711L <memory> (C++20)
__cpp_lib_atomic_value_initialization Reparar la inicialización atómica (inicializar por defecto a std::atomic por valor) 201911L <atomic> <memory> (C++20)
__cpp_lib_atomic_wait Espera std::atomic eficiente 201907L <atomic> (C++20)
__cpp_lib_barrier std::barrier 201907L <barrier> (C++20)
__cpp_lib_bind_back std::bind_back 202202L <functional> (C++23)
__cpp_lib_bind_front std::bind_front 201811L <functional> (C++20)
__cpp_lib_bit_cast std::bit_cast 201806L <bit> (C++20)
__cpp_lib_bitops Operaciones de bits 201907L <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 std::byte 201603L <cstddef> (C++17)
__cpp_lib_byteswap std::byteswap 202110L <bit> (C++23)
__cpp_lib_char8_t Apoyo de la biblioteca para char8_t 201907L <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)
Constexpr para todas las funciones miembro de std::chrono::duration y std::chrono::time_point 201611L <chrono> (C++17)
Calendarios y Husos horarios 201907L <chrono> (C++20)
__cpp_lib_chrono_udls Literales definidos por el usuario para tipos de tiempo 201304L <chrono> (C++14)
__cpp_lib_clamp 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_algorithms Constexpr para algoritmos 201806L <algorithm> (C++20)
__cpp_lib_constexpr_cmath Constexpr para funciones matemáticas en <cmath> y <cstdlib> 202202L <cmath> <cstdlib> (C++23)
__cpp_lib_constexpr_complex Constexpr para std::complex 201711L <complex> (C++20)
__cpp_lib_constexpr_dynamic_alloc Constexpr para std::allocator y utilerías relacionadas 201907L <memory> (C++20)
__cpp_lib_constexpr_functional Constexpr misceláneos (std::default_searcher); constexpr INVOKE 201907L <functional> (C++20)
__cpp_lib_constexpr_iterator Constexpr misceláneos (std::insert_iterator et al.) 201811L <iterator> (C++20)
__cpp_lib_constexpr_memory Constexpr en std::pointer_traits 201811L <memory> (C++20)
Constexpr std::unique_ptr 202202L <memory> (C++23)
__cpp_lib_constexpr_numeric Constexpr para algoritmos in <numeric> 201911L <numeric> (C++20)
__cpp_lib_constexpr_string Constexpr para std::string 201907L <string> (C++20)
__cpp_lib_constexpr_string_view Constexpr misceláneos (std::string_view::copy) 201811L <string_view> (C++20)
__cpp_lib_constexpr_tuple Constexpr misceláneos (std::tuple::operator= et al.) 201811L <tuple> (C++20)
__cpp_lib_constexpr_typeinfo Constexpr misceláneos std::type_info::operator== 202106L <typeinfo> (C++23)
__cpp_lib_constexpr_utility Constexpr misceláneos (std::pair::operator= et al.) 201811L <utility> (C++20)
__cpp_lib_constexpr_vector Constexpr para std::vector 201907L <vector> (C++20)
__cpp_lib_containers_ranges Construcción de rangos e inserción para contenedores 202202L <vector> <list> <forward_list> <map> <set> <unordered_map> <unordered_set> <deque> <queue> <stack> <string> (C++23)
__cpp_lib_coroutine Corrutinas (apoyo de biblioteca) 201902L <coroutine> (C++20)
__cpp_lib_destroying_delete Operador delete de destrucción (apoyo de biblioteca) 201806L <new> (C++20)
__cpp_lib_enable_shared_from_this Especificación más precisa de std::enable_shared_from_this 201603L <memory> (C++17)
__cpp_lib_endian std::endian 201907L <bit> (C++20)
__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 std::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_expected Plantilla de clase std::expected 202202L <expected> (C++23)
__cpp_lib_filesystem Biblioteca del sistema de archivos 201703L <filesystem> (C++17)
__cpp_lib_format Formateo de texto 201907L <format> (C++20)
Verificaciones de cadena de formato en tiempo de compilación, reducir la parametrización de std::vformat_to 202106L <format> (C++20)(DR)
Reparar el manejo de la configuración regional en los formateadores de chrono; apoyar los tipos no const formateables 202110L <format> (C++20)(DR)
__cpp_lib_gcd_lcm std::gcd, std::lcm 201606L <numeric> (C++17)
__cpp_lib_generic_associative_lookup Búsqueda de comparación heterogénea en los contenedores asociativos 201304L <map> <set> (C++14)
__cpp_lib_generic_unordered_lookup Búsqueda de comparación heterogénea en 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 Apoyo mínimo de tipos incompletos para los contenedores estándar para std::forward_list, std::list, y std::vector 201505L <forward_list> <list> <vector> (C++17)
__cpp_lib_int_pow2 Operaciones enteras de potencias al cuadrado (std::has_single_bit, std::bit_ceil, std::bit_floor, std::bit_width) 202002L <bit> (C++20)
__cpp_lib_integer_comparison_functions Funciones de comparación de enteros 202002L <utility> (C++20)
__cpp_lib_integer_sequence Secuencias de enteros en tiempo de compilación 201304L <utility> (C++14)
__cpp_lib_integral_constant_callable std::integral_constant::operator() 201304L <type_traits> (C++14)
__cpp_lib_interpolate std::lerp(), std::midpoint() 201902L <cmath> <numeric> (C++20)
__cpp_lib_invoke Plantilla de función std::invoke 201411L <functional> (C++17)
__cpp_lib_invoke_r std::invoke_r 202106L <functional> (C++23)
__cpp_lib_is_aggregate Rasgo de tipo std::is_aggregate 201703L <type_traits> (C++17)
__cpp_lib_is_constant_evaluated 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_layout_compatible std::is_layout_compatible 201907L <type_traits> (C++20)
__cpp_lib_is_nothrow_convertible std::is_nothrow_convertible 201806L <type_traits> (C++20)
__cpp_lib_is_null_pointer std::is_null_pointer 201309L <type_traits> (C++14)
__cpp_lib_is_pointer_interconvertible Rasgos de interconvertibilidad de punteros: std::is_pointer_interconvertible_with_class, std::is_pointer_interconvertible_base_of 201907L <type_traits> (C++20)
__cpp_lib_is_scoped_enum std::is_scoped_enum 202011L <type_traits> (C++23)
__cpp_lib_is_swappable Rasgos de intercambio [nothrow-] 201603L <type_traits> (C++17)
__cpp_lib_jthread Token de detención e hilo de unión 201911L <stop_token> <thread> (C++20)
__cpp_lib_latch std::latch 201907L <latch> (C++20)
__cpp_lib_launder Asunto principal 1776: Reemplazo de objetos clase que contienen miembros de tipo 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 tipo de operadores lógicos 201510L <type_traits> (C++17)
__cpp_lib_make_from_tuple std::make_from_tuple 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_constants Constantes matemáticas 201907L <numbers> (C++20)
__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_move_only_function std::move_only_function 202110L <functional> (C++23)
__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 std::size(), std::data() y std::empty() 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 Iteradores de avance nulos 201304L <iterator> (C++14)
__cpp_lib_optional std::optional 201606L <optional> (C++17)
std::optional completamente constexpr 202106L <optional> (C++20)(DR)
Operaciones monádicas en std::optional 202110L <optional> (C++23)
__cpp_lib_out_ptr std::out_ptr, std::inout_ptr 202106L <memory> (C++23)
__cpp_lib_parallel_algorithm Algoritmos paralelos 201603L <algorithm> <numeric> (C++17)
__cpp_lib_polymorphic_allocator std::pmr::polymorphic_allocator<> como un tipo vocabulario 201902L <memory_resource> (C++20)
__cpp_lib_quoted_string_io std::quoted 201304L <iomanip> (C++14)
__cpp_lib_ranges Biblioteca de rangos y algoritmos restringidos 201911L <algorithm> <functional> <iterator> <memory> <ranges> (C++20)
Vistas no inicializables por defecto 202106L (C++20)(DR)
Vistas con propiedad 202110L (C++20)(DR)
std::ranges::range_adaptor_closure 202202L (C++23)
__cpp_lib_ranges_chunk std::ranges::chunk_view 202202L <ranges> (C++23)
__cpp_lib_ranges_chunk_by std::ranges::chunk_by_view 202202L <ranges> (C++23)
__cpp_lib_ranges_iota std::ranges::iota 202202L <numeric> (C++23)
__cpp_lib_ranges_join_with std::ranges::join_with_view 202202L <ranges> (C++23)
__cpp_lib_ranges_slide std::ranges::slide_view 202202L <ranges> (C++23)
__cpp_lib_ranges_starts_ends_with std::ranges::starts_with, std::ranges::ends_with 202106L <algorithm> (C++23)
__cpp_lib_ranges_to_container std::ranges::to 202202L <ranges> (C++23)
__cpp_lib_ranges_zip std::ranges::zip_view, std::ranges::zip_transform_view, std::ranges::adjacent_view, std::ranges::adjacent_transform_view 202110L <ranges> <tuple> <utility> (C++23)
__cpp_lib_raw_memory_algorithms Extender herramientas de gestión de memoria 201606L <memory> (C++17)
__cpp_lib_reference_from_temporary std::reference_constructs_from_temporary y std::reference_converts_from_temporary 202202L <type_traits> (C++23)
__cpp_lib_remove_cvref std::remove_cvref 201711L <type_traits> (C++20)
__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_semaphore std::counting_semaphore, std::binary_semaphore 201907L <semaphore> (C++20)
__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)
Apoyo de arrays para std::make_shared 201707L <memory> (C++20)
__cpp_lib_shared_ptr_weak_type shared_ptr::weak_type 201606L <memory> (C++17)
__cpp_lib_shared_timed_mutex std::shared_timed_mutex 201402L <shared_mutex> (C++14)
__cpp_lib_shift std::shift_left y std::shift_right 201806L <algorithm> (C++20)
std::ranges::shift_left y std::ranges::shift_right 202202L <algorithm> (C++23)
__cpp_lib_smart_ptr_for_overwrite Creación de puntero inteligente con inicialización por defecto (std::allocate_shared_for_overwrite, std::make_shared_for_overwrite, std::make_unique_for_overwrite) 202002L <memory> (C++20)
__cpp_lib_source_location Captura de información de código fuente (std::source_location) 201907L <source_location> (C++20)
__cpp_lib_span std::span 202002L <span> (C++20)
__cpp_lib_spanstream std::spanbuf, std::spanstream 202106L <spanstream> (C++23)
__cpp_lib_ssize std::ssize y std::span::size sin signo 201902L <iterator> (C++20)
__cpp_lib_stacktrace Listado de pila 202011L <stacktrace> (C++23)
__cpp_lib_starts_ends_with Verificación de prefijo y sufijo de cadenas (starts_with() y ends_with() para std::string y std::string_view) 201711L <string> <string_view> (C++20)
__cpp_lib_stdatomic_h Encabezado de compatibilidad para operaciones atómicas en C 202011L <stdatomic.h> (C++23)
__cpp_lib_string_contains Funciones contains de std::basic_string y std::basic_string_view 202011L <string> <string_view> (C++23)
__cpp_lib_string_resize_and_overwrite std::basic_string::resize_and_overwrite 202110L <string> (C++23)
__cpp_lib_string_udls Literales definidos por el usuario para tipos cadena 201304L <string> (C++14)
__cpp_lib_string_view std::string_view 201606L <string> <string_view> (C++17)
ConstexprIterator 201803L <string> <string_view> (C++20)
__cpp_lib_syncbuf Flujo de salida con búfer sincronizado (std::syncbuf, std::osyncstream) y manipuladores 201803L <syncstream> (C++20)
__cpp_lib_three_way_comparison Comparación de tres vías (apoyo de biblioteca); agregar comparación de tres vías a la biblioteca 201907L <compare> (C++20)
__cpp_lib_to_address Utilería para convertir un puntero a un puntero sin formato (std::to_address) 201711L <memory> (C++20)
__cpp_lib_to_array std::to_array 201907L <array> (C++20)
__cpp_lib_to_chars Conversiones de cadena elementales (std::to_chars, std::from_chars) 201611L <charconv> (C++17)
__cpp_lib_to_underlying std::to_underlying 202102L <utility> (C++23)
__cpp_lib_transformation_trait_aliases Plantillas de alias para TransformationTraits 201304L <type_traits> (C++14)
__cpp_lib_transparent_operators Objetos función de operador transparentes (std::less<> et al) 201210L <functional> (C++14)
std::owner_less transparente (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 Dirigirse a las tuplas por tipo 201304L <tuple> <utility> (C++14)
__cpp_lib_type_identity std::type_identity 201806L <type_traits> (C++20)
__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_unreachable std::unreachable 202202L <utility> (C++23)
__cpp_lib_unwrap_ref std::unwrap_ref_decay y std::unwrap_reference 201811L <type_traits> (C++20)
__cpp_lib_variant std::variant: una unión de tipo seguro para C++17 201606L <variant> (C++17)
std::visit para clases derivadas de std::variant 202102L <variant> (C++17)(DR)
std::variant complatamente constexpr 202106L <variant> (C++20)(DR)
__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] Volcado de características del compilador

El siguiente programa vuelca las características y atributos de C++ del compilador.

// Cambia estas opciones para imprimir solo la información necesaria.
static struct PrintOptions {
    constexpr static bool titles               = 1;
    constexpr static bool counters             = 1;
    constexpr static bool attributes           = 1;
    constexpr static bool general_features     = 1;
    constexpr static bool core_features        = 1;
    constexpr static bool lib_features         = 1;
    constexpr static bool supported_features   = 1;
    constexpr static bool unsupported_features = 1;
    constexpr static bool sorted_by_value      = 0;
    constexpr static bool cxx11                = 1;
    constexpr static bool cxx14                = 1;
    constexpr static bool cxx17                = 1;
    constexpr static bool cxx20                = 1;
    constexpr static bool cxx23                = 1;
}   print;
 
#if __cplusplus < 201100
#  error "Se requiere C++11 o posterior"
#endif
 
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <string>
 
#ifdef __has_include
# if __has_include(<version>)
#   include <version>
# endif
#endif
 
#define COMPILER_FEATURE_VALUE(value) #value
#define COMPILER_FEATURE_ENTRY(name) { #name, COMPILER_FEATURE_VALUE(name) },
 
#ifdef __has_cpp_attribute
# define COMPILER_ATTRIBUTE_VALUE_AS_STRING(s) #s
# define COMPILER_ATTRIBUTE_AS_NUMBER(x) COMPILER_ATTRIBUTE_VALUE_AS_STRING(x)
# define COMPILER_ATTRIBUTE_ENTRY(attr) \
  { #attr, COMPILER_ATTRIBUTE_AS_NUMBER(__has_cpp_attribute(attr)) },
#else
# define COMPILER_ATTRIBUTE_ENTRY(attr) { #attr, "_" },
#endif
 
struct CompilerFeature {
    CompilerFeature(const char* name = nullptr, const char* value = nullptr)
        : name(name), value(value) {}
    const char* name; const char* value;
};
 
static CompilerFeature cxx_core[] = {
COMPILER_FEATURE_ENTRY(__cplusplus)
COMPILER_FEATURE_ENTRY(__cpp_exceptions)
COMPILER_FEATURE_ENTRY(__cpp_rtti)
#if 0
COMPILER_FEATURE_ENTRY(__GNUC__)
COMPILER_FEATURE_ENTRY(__GNUC_MINOR__)
COMPILER_FEATURE_ENTRY(__GNUC_PATCHLEVEL__)
COMPILER_FEATURE_ENTRY(__GNUG__)
COMPILER_FEATURE_ENTRY(__clang__)
COMPILER_FEATURE_ENTRY(__clang_major__)
COMPILER_FEATURE_ENTRY(__clang_minor__)
COMPILER_FEATURE_ENTRY(__clang_patchlevel__)
#endif
};
static CompilerFeature cxx11_core[] = {
COMPILER_FEATURE_ENTRY(__cpp_alias_templates)
COMPILER_FEATURE_ENTRY(__cpp_attributes)
COMPILER_FEATURE_ENTRY(__cpp_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_decltype)
COMPILER_FEATURE_ENTRY(__cpp_delegating_constructors)
COMPILER_FEATURE_ENTRY(__cpp_inheriting_constructors)
COMPILER_FEATURE_ENTRY(__cpp_initializer_lists)
COMPILER_FEATURE_ENTRY(__cpp_lambdas)
COMPILER_FEATURE_ENTRY(__cpp_nsdmi)
COMPILER_FEATURE_ENTRY(__cpp_range_based_for)
COMPILER_FEATURE_ENTRY(__cpp_raw_strings)
COMPILER_FEATURE_ENTRY(__cpp_ref_qualifiers)
COMPILER_FEATURE_ENTRY(__cpp_rvalue_references)
COMPILER_FEATURE_ENTRY(__cpp_static_assert)
COMPILER_FEATURE_ENTRY(__cpp_threadsafe_static_init)
COMPILER_FEATURE_ENTRY(__cpp_unicode_characters)
COMPILER_FEATURE_ENTRY(__cpp_unicode_literals)
COMPILER_FEATURE_ENTRY(__cpp_user_defined_literals)
COMPILER_FEATURE_ENTRY(__cpp_variadic_templates)
};
static CompilerFeature cxx14_core[] = {
COMPILER_FEATURE_ENTRY(__cpp_aggregate_nsdmi)
COMPILER_FEATURE_ENTRY(__cpp_binary_literals)
COMPILER_FEATURE_ENTRY(__cpp_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_decltype_auto)
COMPILER_FEATURE_ENTRY(__cpp_generic_lambdas)
COMPILER_FEATURE_ENTRY(__cpp_init_captures)
COMPILER_FEATURE_ENTRY(__cpp_return_type_deduction)
COMPILER_FEATURE_ENTRY(__cpp_sized_deallocation)
COMPILER_FEATURE_ENTRY(__cpp_variable_templates)
};
static CompilerFeature cxx14_lib[] = {
COMPILER_FEATURE_ENTRY(__cpp_lib_chrono_udls)
COMPILER_FEATURE_ENTRY(__cpp_lib_complex_udls)
COMPILER_FEATURE_ENTRY(__cpp_lib_exchange_function)
COMPILER_FEATURE_ENTRY(__cpp_lib_generic_associative_lookup)
COMPILER_FEATURE_ENTRY(__cpp_lib_integer_sequence)
COMPILER_FEATURE_ENTRY(__cpp_lib_integral_constant_callable)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_final)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_null_pointer)
COMPILER_FEATURE_ENTRY(__cpp_lib_make_reverse_iterator)
COMPILER_FEATURE_ENTRY(__cpp_lib_make_unique)
COMPILER_FEATURE_ENTRY(__cpp_lib_null_iterators)
COMPILER_FEATURE_ENTRY(__cpp_lib_quoted_string_io)
COMPILER_FEATURE_ENTRY(__cpp_lib_result_of_sfinae)
COMPILER_FEATURE_ENTRY(__cpp_lib_robust_nonmodifying_seq_ops)
COMPILER_FEATURE_ENTRY(__cpp_lib_shared_timed_mutex)
COMPILER_FEATURE_ENTRY(__cpp_lib_string_udls)
COMPILER_FEATURE_ENTRY(__cpp_lib_transformation_trait_aliases)
COMPILER_FEATURE_ENTRY(__cpp_lib_transparent_operators)
COMPILER_FEATURE_ENTRY(__cpp_lib_tuple_element_t)
COMPILER_FEATURE_ENTRY(__cpp_lib_tuples_by_type)
};
 
static CompilerFeature cxx17_core[] = {
COMPILER_FEATURE_ENTRY(__cpp_aggregate_bases)
COMPILER_FEATURE_ENTRY(__cpp_aligned_new)
COMPILER_FEATURE_ENTRY(__cpp_capture_star_this)
COMPILER_FEATURE_ENTRY(__cpp_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_deduction_guides)
COMPILER_FEATURE_ENTRY(__cpp_enumerator_attributes)
COMPILER_FEATURE_ENTRY(__cpp_fold_expressions)
COMPILER_FEATURE_ENTRY(__cpp_guaranteed_copy_elision)
COMPILER_FEATURE_ENTRY(__cpp_hex_float)
COMPILER_FEATURE_ENTRY(__cpp_if_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_inheriting_constructors)
COMPILER_FEATURE_ENTRY(__cpp_inline_variables)
COMPILER_FEATURE_ENTRY(__cpp_namespace_attributes)
COMPILER_FEATURE_ENTRY(__cpp_noexcept_function_type)
COMPILER_FEATURE_ENTRY(__cpp_nontype_template_args)
COMPILER_FEATURE_ENTRY(__cpp_nontype_template_parameter_auto)
COMPILER_FEATURE_ENTRY(__cpp_range_based_for)
COMPILER_FEATURE_ENTRY(__cpp_static_assert)
COMPILER_FEATURE_ENTRY(__cpp_structured_bindings)
COMPILER_FEATURE_ENTRY(__cpp_template_template_args)
COMPILER_FEATURE_ENTRY(__cpp_variadic_using)
};
static CompilerFeature cxx17_lib[] = {
COMPILER_FEATURE_ENTRY(__cpp_lib_addressof_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_lib_allocator_traits_is_always_equal)
COMPILER_FEATURE_ENTRY(__cpp_lib_any)
COMPILER_FEATURE_ENTRY(__cpp_lib_apply)
COMPILER_FEATURE_ENTRY(__cpp_lib_array_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_lib_as_const)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_is_always_lock_free)
COMPILER_FEATURE_ENTRY(__cpp_lib_bool_constant)
COMPILER_FEATURE_ENTRY(__cpp_lib_boyer_moore_searcher)
COMPILER_FEATURE_ENTRY(__cpp_lib_byte)
COMPILER_FEATURE_ENTRY(__cpp_lib_chrono)
COMPILER_FEATURE_ENTRY(__cpp_lib_clamp)
COMPILER_FEATURE_ENTRY(__cpp_lib_enable_shared_from_this)
COMPILER_FEATURE_ENTRY(__cpp_lib_execution)
COMPILER_FEATURE_ENTRY(__cpp_lib_filesystem)
COMPILER_FEATURE_ENTRY(__cpp_lib_gcd_lcm)
COMPILER_FEATURE_ENTRY(__cpp_lib_hardware_interference_size)
COMPILER_FEATURE_ENTRY(__cpp_lib_has_unique_object_representations)
COMPILER_FEATURE_ENTRY(__cpp_lib_hypot)
COMPILER_FEATURE_ENTRY(__cpp_lib_incomplete_container_elements)
COMPILER_FEATURE_ENTRY(__cpp_lib_invoke)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_aggregate)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_invocable)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_swappable)
COMPILER_FEATURE_ENTRY(__cpp_lib_launder)
COMPILER_FEATURE_ENTRY(__cpp_lib_logical_traits)
COMPILER_FEATURE_ENTRY(__cpp_lib_make_from_tuple)
COMPILER_FEATURE_ENTRY(__cpp_lib_map_try_emplace)
COMPILER_FEATURE_ENTRY(__cpp_lib_math_special_functions)
COMPILER_FEATURE_ENTRY(__cpp_lib_memory_resource)
COMPILER_FEATURE_ENTRY(__cpp_lib_node_extract)
COMPILER_FEATURE_ENTRY(__cpp_lib_nonmember_container_access)
COMPILER_FEATURE_ENTRY(__cpp_lib_not_fn)
COMPILER_FEATURE_ENTRY(__cpp_lib_optional)
COMPILER_FEATURE_ENTRY(__cpp_lib_parallel_algorithm)
COMPILER_FEATURE_ENTRY(__cpp_lib_raw_memory_algorithms)
COMPILER_FEATURE_ENTRY(__cpp_lib_sample)
COMPILER_FEATURE_ENTRY(__cpp_lib_scoped_lock)
COMPILER_FEATURE_ENTRY(__cpp_lib_shared_mutex)
COMPILER_FEATURE_ENTRY(__cpp_lib_shared_ptr_arrays)
COMPILER_FEATURE_ENTRY(__cpp_lib_shared_ptr_weak_type)
COMPILER_FEATURE_ENTRY(__cpp_lib_string_view)
COMPILER_FEATURE_ENTRY(__cpp_lib_to_chars)
COMPILER_FEATURE_ENTRY(__cpp_lib_transparent_operators)
COMPILER_FEATURE_ENTRY(__cpp_lib_type_trait_variable_templates)
COMPILER_FEATURE_ENTRY(__cpp_lib_uncaught_exceptions)
COMPILER_FEATURE_ENTRY(__cpp_lib_unordered_map_try_emplace)
COMPILER_FEATURE_ENTRY(__cpp_lib_variant)
COMPILER_FEATURE_ENTRY(__cpp_lib_void_t)
};
 
static CompilerFeature cxx20_core[] = {
COMPILER_FEATURE_ENTRY(__cpp_aggregate_paren_init)
COMPILER_FEATURE_ENTRY(__cpp_char8_t)
COMPILER_FEATURE_ENTRY(__cpp_concepts)
COMPILER_FEATURE_ENTRY(__cpp_conditional_explicit)
COMPILER_FEATURE_ENTRY(__cpp_consteval)
COMPILER_FEATURE_ENTRY(__cpp_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_constexpr_dynamic_alloc)
COMPILER_FEATURE_ENTRY(__cpp_constexpr_in_decltype)
COMPILER_FEATURE_ENTRY(__cpp_constinit)
COMPILER_FEATURE_ENTRY(__cpp_deduction_guides)
COMPILER_FEATURE_ENTRY(__cpp_designated_initializers)
COMPILER_FEATURE_ENTRY(__cpp_generic_lambdas)
COMPILER_FEATURE_ENTRY(__cpp_impl_coroutine)
COMPILER_FEATURE_ENTRY(__cpp_impl_destroying_delete)
COMPILER_FEATURE_ENTRY(__cpp_impl_three_way_comparison)
COMPILER_FEATURE_ENTRY(__cpp_init_captures)
COMPILER_FEATURE_ENTRY(__cpp_modules)
COMPILER_FEATURE_ENTRY(__cpp_nontype_template_args)
COMPILER_FEATURE_ENTRY(__cpp_using_enum)
};
static CompilerFeature cxx20_lib[] = {
COMPILER_FEATURE_ENTRY(__cpp_lib_array_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_lib_assume_aligned)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_flag_test)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_float)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_lock_free_type_aliases)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_ref)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_shared_ptr)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_value_initialization)
COMPILER_FEATURE_ENTRY(__cpp_lib_atomic_wait)
COMPILER_FEATURE_ENTRY(__cpp_lib_barrier)
COMPILER_FEATURE_ENTRY(__cpp_lib_bind_front)
COMPILER_FEATURE_ENTRY(__cpp_lib_bit_cast)
COMPILER_FEATURE_ENTRY(__cpp_lib_bitops)
COMPILER_FEATURE_ENTRY(__cpp_lib_bounded_array_traits)
COMPILER_FEATURE_ENTRY(__cpp_lib_char8_t)
COMPILER_FEATURE_ENTRY(__cpp_lib_chrono)
COMPILER_FEATURE_ENTRY(__cpp_lib_concepts)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_algorithms)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_complex)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_dynamic_alloc)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_functional)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_iterator)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_memory)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_numeric)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_string)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_string_view)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_tuple)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_utility)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_vector)
COMPILER_FEATURE_ENTRY(__cpp_lib_coroutine)
COMPILER_FEATURE_ENTRY(__cpp_lib_destroying_delete)
COMPILER_FEATURE_ENTRY(__cpp_lib_endian)
COMPILER_FEATURE_ENTRY(__cpp_lib_erase_if)
COMPILER_FEATURE_ENTRY(__cpp_lib_execution)
COMPILER_FEATURE_ENTRY(__cpp_lib_format)
COMPILER_FEATURE_ENTRY(__cpp_lib_generic_unordered_lookup)
COMPILER_FEATURE_ENTRY(__cpp_lib_int_pow2)
COMPILER_FEATURE_ENTRY(__cpp_lib_integer_comparison_functions)
COMPILER_FEATURE_ENTRY(__cpp_lib_interpolate)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_constant_evaluated)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_layout_compatible)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_nothrow_convertible)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_pointer_interconvertible)
COMPILER_FEATURE_ENTRY(__cpp_lib_jthread)
COMPILER_FEATURE_ENTRY(__cpp_lib_latch)
COMPILER_FEATURE_ENTRY(__cpp_lib_list_remove_return_type)
COMPILER_FEATURE_ENTRY(__cpp_lib_math_constants)
COMPILER_FEATURE_ENTRY(__cpp_lib_polymorphic_allocator)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges)
COMPILER_FEATURE_ENTRY(__cpp_lib_remove_cvref)
COMPILER_FEATURE_ENTRY(__cpp_lib_semaphore)
COMPILER_FEATURE_ENTRY(__cpp_lib_shared_ptr_arrays)
COMPILER_FEATURE_ENTRY(__cpp_lib_shift)
COMPILER_FEATURE_ENTRY(__cpp_lib_smart_ptr_for_overwrite)
COMPILER_FEATURE_ENTRY(__cpp_lib_source_location)
COMPILER_FEATURE_ENTRY(__cpp_lib_span)
COMPILER_FEATURE_ENTRY(__cpp_lib_ssize)
COMPILER_FEATURE_ENTRY(__cpp_lib_starts_ends_with)
COMPILER_FEATURE_ENTRY(__cpp_lib_string_view)
COMPILER_FEATURE_ENTRY(__cpp_lib_syncbuf)
COMPILER_FEATURE_ENTRY(__cpp_lib_three_way_comparison)
COMPILER_FEATURE_ENTRY(__cpp_lib_to_address)
COMPILER_FEATURE_ENTRY(__cpp_lib_to_array)
COMPILER_FEATURE_ENTRY(__cpp_lib_type_identity)
COMPILER_FEATURE_ENTRY(__cpp_lib_unwrap_ref)
};
 
static CompilerFeature cxx23_core[] = {
//< Continuar poblando
COMPILER_FEATURE_ENTRY(__cpp_constexpr)
COMPILER_FEATURE_ENTRY(__cpp_explicit_this_parameter)
COMPILER_FEATURE_ENTRY(__cpp_if_consteval)
COMPILER_FEATURE_ENTRY(__cpp_multidimensional_subscript)
COMPILER_FEATURE_ENTRY(__cpp_size_t_suffix)
};
static CompilerFeature cxx23_lib[] = {
//< Continuar poblando
COMPILER_FEATURE_ENTRY(__cpp_lib_adaptor_iterator_pair_constructor)
COMPILER_FEATURE_ENTRY(__cpp_lib_allocate_at_least)
COMPILER_FEATURE_ENTRY(__cpp_lib_associative_heterogeneous_erasure)
COMPILER_FEATURE_ENTRY(__cpp_lib_bind_back)
COMPILER_FEATURE_ENTRY(__cpp_lib_byteswap)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_cmath)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_memory)
COMPILER_FEATURE_ENTRY(__cpp_lib_constexpr_typeinfo)
COMPILER_FEATURE_ENTRY(__cpp_lib_containers_ranges)
COMPILER_FEATURE_ENTRY(__cpp_lib_expected)
COMPILER_FEATURE_ENTRY(__cpp_lib_format)
COMPILER_FEATURE_ENTRY(__cpp_lib_invoke_r)
COMPILER_FEATURE_ENTRY(__cpp_lib_is_scoped_enum)
COMPILER_FEATURE_ENTRY(__cpp_lib_move_only_function)
COMPILER_FEATURE_ENTRY(__cpp_lib_optional)
COMPILER_FEATURE_ENTRY(__cpp_lib_out_ptr)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_chunk)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_chunk_by)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_iota)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_join_with)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_slide)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_starts_ends_with)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_to_container)
COMPILER_FEATURE_ENTRY(__cpp_lib_ranges_zip)
COMPILER_FEATURE_ENTRY(__cpp_lib_reference_from_temporary)
COMPILER_FEATURE_ENTRY(__cpp_lib_shift)
COMPILER_FEATURE_ENTRY(__cpp_lib_spanstream)
COMPILER_FEATURE_ENTRY(__cpp_lib_stacktrace)
COMPILER_FEATURE_ENTRY(__cpp_lib_stdatomic_h)
COMPILER_FEATURE_ENTRY(__cpp_lib_string_contains)
COMPILER_FEATURE_ENTRY(__cpp_lib_string_resize_and_overwrite)
COMPILER_FEATURE_ENTRY(__cpp_lib_to_underlying)
COMPILER_FEATURE_ENTRY(__cpp_lib_unreachable)
COMPILER_FEATURE_ENTRY(__cpp_lib_variant)
};
 
static CompilerFeature attributes[] = {
COMPILER_ATTRIBUTE_ENTRY(carries_dependency)
COMPILER_ATTRIBUTE_ENTRY(deprecated)
COMPILER_ATTRIBUTE_ENTRY(fallthrough)
COMPILER_ATTRIBUTE_ENTRY(likely)
COMPILER_ATTRIBUTE_ENTRY(maybe_unused)
COMPILER_ATTRIBUTE_ENTRY(nodiscard)
COMPILER_ATTRIBUTE_ENTRY(noreturn)
COMPILER_ATTRIBUTE_ENTRY(no_unique_address)
COMPILER_ATTRIBUTE_ENTRY(unlikely)
};
 
constexpr bool is_feature_supported(const CompilerFeature& x) {
    return x.value[0] != '_' && x.value[0] != '0';
}
 
inline void print_compiler_feature(const CompilerFeature& x) {
    constexpr static int max_name_length = 44; //< Update if necessary
    std::string value{ is_feature_supported(x) ? x.value : "------" };
    if (value.back() == 'L') value.pop_back(); //~ 201603L -> 201603
    // value.insert(4, 1, '-'); //~ 201603 -> 2016-03
    if ( (print.supported_features && is_feature_supported(x))
        or (print.unsupported_features && !is_feature_supported(x))) {
            std::cout << std::left << std::setw(max_name_length)
                      << x.name << " " << value << '\n';
    }
}
 
template<size_t N>
inline void show(char const* title, CompilerFeature (&features)[N]) {
    if (print.titles) {
        std::cout << '\n' << std::left << title << " (";
        if (print.counters)
            std::cout << std::count_if(
                std::begin(features), std::end(features), is_feature_supported) << '/';
        std::cout << N << ")\n";
    }
    if (print.sorted_by_value) {
        std::sort(std::begin(features), std::end(features),
            [](CompilerFeature const& lhs, CompilerFeature const& rhs) {
                return std::strcmp(lhs.value, rhs.value) < 0;
            });
    }
    for (const CompilerFeature& x : features) {
        print_compiler_feature(x);
    }
}
 
int main() {
    if (print.general_features) show("C++ GENERAL", cxx_core);
    if (print.cxx11 && print.core_features) show("C++11 CORE", cxx11_core);
    if (print.cxx14 && print.core_features) show("C++14 CORE", cxx14_core);
    if (print.cxx14 && print.lib_features ) show("C++14 LIB" , cxx14_lib);
    if (print.cxx17 && print.core_features) show("C++17 CORE", cxx17_core);
    if (print.cxx17 && print.lib_features ) show("C++17 LIB" , cxx17_lib);
    if (print.cxx20 && print.core_features) show("C++20 CORE", cxx20_core);
    if (print.cxx20 && print.lib_features ) show("C++20 LIB" , cxx20_lib);
    if (print.cxx23 && print.core_features) show("C++23 CORE", cxx23_core);
    if (print.cxx23 && print.lib_features ) show("C++23 LIB" , cxx23_lib);
    if (print.attributes) show("ATTRIBUTES", attributes);
}

Posible salida:

C++ GENERAL (3/3)
__cplusplus                                  202002
__cpp_exceptions                             199711
__cpp_rtti                                   199711
 
C++11 CORE (19/19)
__cpp_alias_templates                        200704
__cpp_attributes                             200809
__cpp_constexpr                              201907
__cpp_decltype                               200707
__cpp_delegating_constructors                200604
__cpp_inheriting_constructors                201511
__cpp_initializer_lists                      200806
__cpp_lambdas                                200907
__cpp_nsdmi                                  200809
__cpp_range_based_for                        201603
__cpp_raw_strings                            200710
__cpp_ref_qualifiers                         200710
__cpp_rvalue_references                      200610
__cpp_static_assert                          201411
__cpp_threadsafe_static_init                 200806
__cpp_unicode_characters                     200704
__cpp_unicode_literals                       200710
__cpp_user_defined_literals                  200809
__cpp_variadic_templates                     200704
 
C++14 CORE (9/9)
__cpp_aggregate_nsdmi                        201304
__cpp_binary_literals                        201304
__cpp_constexpr                              201907
__cpp_decltype_auto                          201304
__cpp_generic_lambdas                        201707
__cpp_init_captures                          201803
__cpp_return_type_deduction                  201304
__cpp_sized_deallocation                     ------
__cpp_variable_templates                     201304
 
... truncado ...

[editar] Véase también