Namespaces
Variants

Standard library header <type_traits> (C++11)

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca de metaprogramación .

Contenidos

Clases

Clases Auxiliares
constante en tiempo de compilación de tipo especificado con valor especificado
(plantilla de clase)
true_type std:: integral_constant < bool , true >
false_type std:: integral_constant < bool , false >
Categorías primarias de tipos
(C++11)
comprueba si un tipo es void
(plantilla de clase)
(C++11) ( DR* )
comprueba si un tipo es std::nullptr_t
(plantilla de clase)
comprueba si un tipo es un tipo integral
(plantilla de clase)
verifica si un tipo es un tipo de punto flotante
(class template)
(C++11)
comprueba si un tipo es un tipo array
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo de enumeración
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo unión
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo de clase no-union
(plantilla de clase)
verifica si un tipo es un tipo de función
(class template)
(C++11)
comprueba si un tipo es un tipo puntero
(plantilla de clase)
comprueba si un tipo es una lvalue reference
(class template)
comprueba si un tipo es una rvalue reference
(plantilla de clase)
verifica si un tipo es un puntero a miembro de objeto no estático
(plantilla de clase)
comprueba si un tipo es un puntero a función miembro no estático
(plantilla de clase)
Categorías de tipos compuestos
verifica si un tipo es un tipo fundamental
(plantilla de clase)
verifica si un tipo es un tipo aritmético
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo escalar
(plantilla de clase)
(C++11)
verifica si un tipo es un tipo objeto
(plantilla de clase)
verifica si un tipo es un tipo compuesto
(plantilla de clase)
comprueba si un tipo es una lvalue reference o una rvalue reference
(class template)
verifica si un tipo es un puntero a una función miembro no estática o a un objeto
(plantilla de clase)
Propiedades de tipo
(C++11)
verifica si un tipo está calificado como const
(plantilla de clase)
verifica si un tipo está calificado como volatile
(plantilla de clase)
(C++11) (deprecated in C++26)
verifica si un tipo es trivial
(plantilla de clase)
verifica si un tipo es trivialmente copiable
(plantilla de clase)
verifica si un tipo es un tipo de diseño estándar
(plantilla de clase)
(C++11) (obsoleto en C++20)
verifica si un tipo es un tipo de datos simple (POD)
(plantilla de clase)
(C++11) (obsoleto en C++17) (eliminado en C++20)
comprueba si un tipo es un literal type
(plantilla de clase)
verifica si cada bit en la representación de objeto del tipo contribuye a su valor
(plantilla de clase)
(C++11)
verifica si un tipo es una clase (pero no unión) y no tiene miembros de datos no estáticos
(plantilla de clase)
verifica si un tipo es un tipo de clase polimórfica
(plantilla de clase)
verifica si un tipo es una clase abstracta
(plantilla de clase)
(C++14)
verifica si un tipo es un tipo de clase final
(plantilla de clase)
verifica si un tipo es un tipo agregado
(plantilla de clase)
verifica si un tipo es un tipo de duración implícita
(plantilla de clase)
(C++11)
comprueba si un tipo es un tipo aritmético con signo
(plantilla de clase)
comprueba si un tipo es un tipo aritmético sin signo
(plantilla de clase)
verifica si un tipo es un tipo array con límite conocido
(plantilla de clase)
comprueba si un tipo es un tipo array de límite desconocido
(plantilla de clase)
verifica si un tipo es un tipo de enumeración con ámbito
(plantilla de clase)
Operaciones soportadas
verifica si un tipo tiene un constructor para argumentos específicos
(plantilla de clase)
verifica si un tipo tiene un constructor por defecto
(plantilla de clase)
verifica si un tipo tiene un constructor de copia
(plantilla de clase)
verifica si un tipo puede ser construido desde una referencia a valor temporal
(plantilla de clase)
verifica si un tipo tiene un operador de asignación para un argumento específico
(plantilla de clase)
verifica si un tipo tiene un operador de asignación de copia
(plantilla de clase)
verifica si un tipo tiene un operador de asignación de movimiento
(plantilla de clase)
verifica si un tipo tiene un destructor no eliminado
(plantilla de clase)
verifica si un tipo tiene un destructor virtual
(plantilla de clase)
verifica si objetos de un tipo pueden intercambiarse con objetos del mismo o diferente tipo
(plantilla de clase)
verifica si una referencia está vinculada a un temporal en inicialización por copia
(plantilla de clase)
verifica si una referencia está vinculada a un temporal en inicialización directa
(plantilla de clase)
Consultas de propiedades
obtiene los requisitos de alineación del tipo
(plantilla de clase)
(C++11)
obtiene el número de dimensiones de un tipo de arreglo
(plantilla de clase)
(C++11)
obtiene el tamaño de un tipo de arreglo a lo largo de una dimensión especificada
(plantilla de clase)
Relaciones de tipos
(C++11)
verifica si dos tipos son iguales
(class template)
(C++11)
verifica si un tipo es una base de otro tipo
(plantilla de clase)
verifica si un tipo es una base virtual de otro tipo
(plantilla de clase)
verifica si un tipo puede ser convertido a otro tipo
(class template)
verifica si dos tipos son layout-compatible
(plantilla de clase)
comprueba si un tipo es una base pointer-interconvertible (inicial) de otro tipo
(plantilla de clase)
verifica si un tipo puede ser invocado (como si mediante std::invoke ) con los tipos de argumentos dados
(plantilla de clase)
Especificadores de const-volatilidad
elimina const y/o volatile especificadores del tipo dado
(plantilla de clase)
(C++11) (C++11) (C++11)
añade const y/o volatile especificadores al tipo dado
(plantilla de clase)
Referencias
elimina una referencia del tipo dado
(plantilla de clase)
añade una referencia lvalue o rvalue al tipo dado
(plantilla de clase)
Punteros
elimina un puntero del tipo dado
(plantilla de clase)
añade un puntero al tipo dado
(plantilla de clase)
Modificadores de signo
obtiene el tipo con signo correspondiente para el tipo integral dado
(plantilla de clase)
obtiene el tipo con signo correspondiente para el tipo integral dado
(plantilla de clase)
Arreglos
elimina una dimensión del tipo de arreglo dado
(plantilla de clase)
elimina todas las dimensiones del tipo de arreglo dado
(plantilla de clase)
Transformaciones misceláneas
(since C++11) (deprecated in C++23)
define el tipo adecuado para usar como almacenamiento no inicializado para tipos de tamaño dado
(plantilla de clase)
(since C++11) (deprecated in C++23)
define el tipo adecuado para usar como almacenamiento no inicializado para todos los tipos dados
(plantilla de clase)
(C++11)
aplica transformaciones de tipos como cuando se pasa un argumento de función por valor
(plantilla de clase)
combina std::remove_cv y std::remove_reference
(plantilla de clase)
(C++11)
elimina condicionalmente una sobrecarga de función o especialización de plantilla de la resolución de sobrecarga
(plantilla de clase)
elige un tipo u otro basado en un booleano en tiempo de compilación
(plantilla de clase)
determina el tipo común de un grupo de tipos
(plantilla de clase)
determina el tipo de referencia común de un grupo de tipos
(plantilla de clase)
obtiene el tipo entero subyacente para un tipo de enumeración dado
(plantilla de clase)
(C++11) (eliminado en C++20) (C++17)
deduce el tipo de resultado de invocar un objeto invocable con un conjunto de argumentos
(plantilla de clase)
(C++17)
plantilla de alias variádica void
(plantilla de alias)
devuelve el argumento de tipo sin cambios
(plantilla de clase)
obtener el tipo de referencia envuelto en std::reference_wrapper
(plantilla de clase)
Operaciones sobre traits
función metaprogramática AND lógica variádica
(plantilla de clase)
metafunción OR lógica variádica
(plantilla de clase)
(C++17)
metafunción NOT lógica
(plantilla de clase)

Funciones

Relaciones de miembros
verifica si los objetos de un tipo son pointer-interconvertible con el subobjeto especificado de ese tipo
(plantilla de función)
verifica si dos miembros especificados se corresponden entre sí en la subsecuencia inicial común de dos tipos especificados
(plantilla de función)
Contexto de evaluación constante
detecta si la llamada ocurre dentro de un contexto de evaluación constante
(función)
verifica si un puntero está dentro del tiempo de vida del objeto en tiempo de compilación
(función)

Sinopsis

namespace std {
  // clase auxiliar
  template<class T, T v> struct integral_constant;
  template<bool B>
    using bool_constant = integral_constant<bool, B>;
  using true_type  = bool_constant<true>;
  using false_type = bool_constant<false>;
  // categorías primarias de tipos
  template<class T> struct is_void;
  template<class T> struct is_null_pointer;
  template<class T> struct is_integral;
  template<class T> struct is_floating_point;
  template<class T> struct is_array;
  template<class T> struct is_pointer;
  template<class T> struct is_lvalue_reference;
  template<class T> struct is_rvalue_reference;
  template<class T> struct is_member_object_pointer;
  template<class T> struct is_member_function_pointer;
  template<class T> struct is_enum;
  template<class T> struct is_union;
  template<class T> struct is_class;
  template<class T> struct is_function;
  // categorías de tipos compuestos
  template<class T> struct is_reference;
  template<class T> struct is_arithmetic;
  template<class T> struct is_fundamental;
  template<class T> struct is_object;
  template<class T> struct is_scalar;
  template<class T> struct is_compound;
  template<class T> struct is_member_pointer;
  // propiedades de tipos
  template<class T> struct is_const;
  template<class T> struct is_volatile;
  template<class T> struct is_trivial;
  template<class T> struct is_trivially_copyable;
  template<class T> struct is_standard_layout;
  template<class T> struct is_empty;
  template<class T> struct is_polymorphic;
  template<class T> struct is_abstract;
  template<class T> struct is_final;
  template<class T> struct is_aggregate;
  template<class T> struct is_signed;
  template<class T> struct is_unsigned;
  template<class T> struct is_bounded_array;
  template<class T> struct is_unbounded_array;
  template<class T> struct is_scoped_enum;
  template<class T, class... Args> struct is_constructible;
  template<class T> struct is_default_constructible;
  template<class T> struct is_copy_constructible;
  template<class T> struct is_move_constructible;
  template<class T, class U> struct is_assignable;
  template<class T> struct is_copy_assignable;
  template<class T> struct is_move_assignable;
  template<class T, class U> struct is_swappable_with;
  template<class T> struct is_swappable;
  template<class T> struct is_destructible;
  template<class T, class... Args> struct is_trivially_constructible;
  template<class T> struct is_trivially_default_constructible;
  template<class T> struct is_trivially_copy_constructible;
  template<class T> struct is_trivially_move_constructible;
  template<class T, class U> struct is_trivially_assignable;
  template<class T> struct is_trivially_copy_assignable;
  template<class T> struct is_trivially_move_assignable;
  template<class T> struct is_trivially_destructible;
  template<class T, class... Args> struct is_nothrow_constructible;
  template<class T> struct is_nothrow_default_constructible;
  template<class T> struct is_nothrow_copy_constructible;
  template<class T> struct is_nothrow_move_constructible;
  template<class T, class U> struct is_nothrow_assignable;
  template<class T> struct is_nothrow_copy_assignable;
  template<class T> struct is_nothrow_move_assignable;
  template<class T, class U> struct is_nothrow_swappable_with;
  template<class T> struct is_nothrow_swappable;
  template<class T> struct is_nothrow_destructible;
  template<class T> struct has_virtual_destructor;
  template<class T> struct has_unique_object_representations;
  template<class T, class U> struct reference_constructs_from_temporary;
  template<class T, class U> struct reference_converts_from_temporary;
  // consultas de propiedades de tipo
  template<class T> struct alignment_of;
  template<class T> struct rank;
  template<class T, unsigned I = 0> struct extent;
  // relaciones de tipos
  template<class T, class U> struct is_same;
  template<class Base, class Derived> struct is_base_of;
  template<class Base, class Derived> struct is_virtual_base_of;
  template<class From, class To> struct is_convertible;
  template<class From, class To> struct is_nothrow_convertible;
  template<class T, class U> struct is_layout_compatible;
  template<class Base, class Derived> struct is_pointer_interconvertible_base_of;
  template<class Fn, class... ArgTypes> struct is_invocable;
  template<class R, class Fn, class... ArgTypes> struct is_invocable_r;
  template<class Fn, class... ArgTypes> struct is_nothrow_invocable;
  template<class R, class Fn, class... ArgTypes> struct is_nothrow_invocable_r;
  // modificaciones const-volatile
  template<class T> struct remove_const;
  template<class T> struct remove_volatile;
  template<class T> struct remove_cv;
  template<class T> struct add_const;
  template<class T> struct add_volatile;
  template<class T> struct add_cv;
  template<class T>
    using remove_const_t    = typename remove_const<T>::type;
  template<class T>
    using remove_volatile_t = typename remove_volatile<T>::type;
  template<class T>
    using remove_cv_t       = typename remove_cv<T>::type;
  template<class T>
    using add_const_t       = typename add_const<T>::type;
  template<class T>
    using add_volatile_t    = typename add_volatile<T>::type;
  template<class T>
    using add_cv_t          = typename add_cv<T>::type;
  // modificaciones de referencia
  template<class T> struct remove_reference;
  template<class T> struct add_lvalue_reference;
  template<class T> struct add_rvalue_reference;
  template<class T>
    using remove_reference_t     = typename remove_reference<T>::type;
  template<class T>
    using add_lvalue_reference_t = typename add_lvalue_reference<T>::type;
  template<class T>
    using add_rvalue_reference_t = typename add_rvalue_reference<T>::type;
  // modificaciones de signo
  template<class T> struct make_signed;
  template<class T> struct make_unsigned;
  template<class T>
    using make_signed_t   = typename make_signed<T>::type;
  template<class T>
    using make_unsigned_t = typename make_unsigned<T>::type;
  // modificaciones de array
  template<class T> struct remove_extent;
  template<class T> struct remove_all_extents;
  template<class T>
    using remove_extent_t      = typename remove_extent<T>::type;
  template<class T>
    using remove_all_extents_t = typename remove_all_extents<T>::type;
  // modificaciones de punteros
  template<class T> struct remove_pointer;
  template<class T> struct add_pointer;
  template<class T>
    using remove_pointer_t = typename remove_pointer<T>::type;
  template<class T>
    using add_pointer_t    = typename add_pointer<T>::type;
  // otras transformaciones
  template<class T> struct type_identity;
  template<class T> struct remove_cvref;
  template<class T> struct decay;
  template<bool, class T = void> struct enable_if;
  template<bool, class T, class F> struct conditional;
  template<class... T> struct common_type;
  template<class T, class U, template<class> class TQual, template<class> class UQual>
    struct basic_common_reference { };
  template<class... T> struct common_reference;
  template<class T> struct underlying_type;
  template<class Fn, class... ArgTypes> struct invoke_result;
  template<class T> struct unwrap_reference;
  template<class T> struct unwrap_ref_decay;
  template<class T>
    using type_identity_t    = typename type_identity<T>::type;
  template<class T>
    using remove_cvref_t     = typename remove_cvref<T>::type;
  template<class T>
    using decay_t            = typename decay<T>::type;
  template<bool b, class T = void>
    using enable_if_t        = typename enable_if<b, T>::type;
  template<bool b, class T, class F>
    using conditional_t      = typename conditional<b, T, F>::type;
  template<class... T>
    using common_type_t      = typename common_type<T...>::type;
  template<class... T>
    using common_reference_t = typename common_reference<T...>::type;
  template<class T>
    using underlying_type_t  = typename underlying_type<T>::type;
  template<class Fn, class... ArgTypes>
    using invoke_result_t    = typename invoke_result<Fn, ArgTypes...>::type;
  template<class T>
    using unwrap_reference_t = typename unwrap_reference<T>::type;
  template<class T>
    using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type;
  template<class...>
    using void_t             = void;
  // rasgos de operadores lógicos
  template<class... B> struct conjunction;
  template<class... B> struct disjunction;
  template<class B> struct negation;
  // categorías de tipos primarios
  template<class T>
    inline constexpr bool is_void_v = is_void<T>::valor;
  template<class T>
    inline constexpr bool is_null_pointer_v = is_null_pointer<T>::valor;
  template<class T>
    inline constexpr bool is_integral_v = is_integral<T>::valor;
  template<class T>
    inline constexpr bool is_floating_point_v = is_floating_point<T>::valor;
  template<class T>
    inline constexpr bool is_array_v = is_array<T>::valor;
  template<class T>
    inline constexpr bool is_pointer_v = is_pointer<T>::valor;
  template<class T>
    inline constexpr bool is_lvalue_reference_v = is_lvalue_reference<T>::valor;
  template<class T>
    inline constexpr bool is_rvalue_reference_v = is_rvalue_reference<T>::valor;
  template<class T>
    inline constexpr bool is_member_object_pointer_v = is_member_object_pointer<T>::valor;
  template<class T>
    inline constexpr bool is_member_function_pointer_v = is_member_function_pointer<T>::valor;
  template<class T>
    inline constexpr bool is_enum_v = is_enum<T>::valor;
  template<class T>
    inline constexpr bool is_union_v = is_union<T>::valor;
  template<class T>
    inline constexpr bool is_class_v = is_class<T>::valor;
  template<class T>
    inline constexpr bool is_function_v = is_function<T>::value;
  // categorías de tipos compuestos
  template<class T>
    inline constexpr bool is_reference_v = is_reference<T>::valor;
  template<class T>
    inline constexpr bool is_arithmetic_v = is_arithmetic<T>::valor;
  template<class T>
    inline constexpr bool is_fundamental_v = is_fundamental<T>::valor;
  template<class T>
    inline constexpr bool is_object_v = is_object<T>::value;
  template<class T>
    inline constexpr bool is_scalar_v = is_scalar<T>::valor;
  template<class T>
    inline constexpr bool is_compound_v = is_compound<T>::valor;
  template<class T>
    inline constexpr bool is_member_pointer_v = is_member_pointer<T>::valor;
  // propiedades de tipo
  template<class T>
    inline constexpr bool is_const_v = is_const<T>::valor;
  template<class T>
    inline constexpr bool is_volatile_v = is_volatile<T>::valor;
  template<class T>
    inline constexpr bool is_trivial_v = is_trivial<T>::valor;
  template<class T>
    inline constexpr bool is_trivially_copyable_v = is_trivially_copyable<T>::valor;
  template<class T>
    inline constexpr bool is_standard_layout_v = is_standard_layout<T>::valor;
  template<class T>
    inline constexpr bool is_empty_v = is_empty<T>::valor;
  template<class T>
    inline constexpr bool is_polymorphic_v = is_polymorphic<T>::valor;
  template<class T>
    inline constexpr bool is_abstract_v = is_abstract<T>::valor;
  template<class T>
    inline constexpr bool is_final_v = is_final<T>::valor;
  template<class T>
    inline constexpr bool is_aggregate_v = is_aggregate<T>::valor;
  template<class T>
    inline constexpr bool is_signed_v = is_signed<T>::valor;
  template<class T>
    inline constexpr bool is_unsigned_v = is_unsigned<T>::valor;
  template<class T>
    inline constexpr bool is_bounded_array_v = is_bounded_array<T>::valor;
  template<class T>
    inline constexpr bool is_unbounded_array_v = is_unbounded_array<T>::valor;
  template<class T>
    inline constexpr bool is_scoped_enum_v = is_scoped_enum<T>::valor;
  template<class T, class... Args>
    inline constexpr bool is_constructible_v = is_constructible<T, Args...>::valor;
  template<class T>
    inline constexpr bool is_default_constructible_v = is_default_constructible<T>::valor;
  template<class T>
    inline constexpr bool is_copy_constructible_v = is_copy_constructible<T>::valor;
  template<class T>
    inline constexpr bool is_move_constructible_v = is_move_constructible<T>::valor;
  template<class T, class U>
    inline constexpr bool is_assignable_v = is_assignable<T, U>::valor;
  template<class T>
    inline constexpr bool is_copy_assignable_v = is_copy_assignable<T>::valor;
  template<class T>
    inline constexpr bool is_move_assignable_v = is_move_assignable<T>::value;
  template<class T, class U>
    inline constexpr bool is_swappable_with_v = is_swappable_with<T, U>::valor;
  template<class T>
    inline constexpr bool is_swappable_v = is_swappable<T>::valor;
  template<class T>
    inline constexpr bool is_destructible_v = is_destructible<T>::valor;
  template<class T, class... Args>
    inline constexpr bool is_trivially_constructible_v
      = is_trivially_constructible<T, Args...>::valor;
  template<class T>
    inline constexpr bool is_trivially_default_constructible_v
      = is_trivially_default_constructible<T>::valor;
  template<class T>
    inline constexpr bool is_trivially_copy_constructible_v
      = is_trivially_copy_constructible<T>::valor;
  template<class T>
    inline constexpr bool is_trivially_move_constructible_v
      = is_trivially_move_constructible<T>::valor;
  template<class T, class U>
    inline constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::valor;
  template<class T>
    inline constexpr bool is_trivially_copy_assignable_v
      = is_trivially_copy_assignable<T>::valor;
  template<class T>
    inline constexpr bool is_trivially_move_assignable_v
      = is_trivially_move_assignable<T>::valor;
  template<class T>
    inline constexpr bool is_trivially_destructible_v = is_trivially_destructible<T>::valor;
  template<class T, class... Args>
    inline constexpr bool is_nothrow_constructible_v
      = is_nothrow_constructible<T, Args...>::value;
  template<class T>
    inline constexpr bool is_nothrow_default_constructible_v
      = is_nothrow_default_constructible<T>::valor;
  template<class T>
    inline constexpr bool is_nothrow_copy_constructible_v
      = is_nothrow_copy_constructible<T>::valor;
  template<class T>
    inline constexpr bool is_nothrow_move_constructible_v
      = is_nothrow_move_constructible<T>::valor;
  template<class T, class U>
    inline constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::valor;
  template<class T>
    inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<T>::valor;
  template<class T>
    inline constexpr bool is_nothrow_move_assignable_v = is_nothrow_move_assignable<T>::valor;
  template<class T, class U>
    inline constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with<T, U>::valor;
  template<class T>
    inline constexpr bool is_nothrow_swappable_v = is_nothrow_swappable<T>::valor;
  template<class T>
    inline constexpr bool is_nothrow_destructible_v = is_nothrow_destructible<T>::valor;
  template<class T>
    inline constexpr bool has_virtual_destructor_v = has_virtual_destructor<T>::valor;
  template<class T>
    inline constexpr bool has_unique_object_representations_v
      = has_unique_object_representations<T>::valor;
  template<class T, class U>
    inline constexpr bool reference_constructs_from_temporary_v
      = reference_constructs_from_temporary<T, U>::valor;
  template<class T, class U>
    inline constexpr bool reference_converts_from_temporary_v
      = reference_converts_from_temporary<T, U>::valor;
  // consultas de propiedades de tipo
  template<class T>
    inline constexpr size_t alignment_of_v = alignment_of<T>::valor;
  template<class T>
    inline constexpr size_t rank_v = rank<T>::valor;
  template<class T, unsigned I = 0>
    inline constexpr size_t extent_v = extent<T, I>::valor;
  // relaciones de tipos
  template<class T, class U>
    inline constexpr bool is_same_v = is_same<T, U>::valor;
  template<class Base, class Derived>
    inline constexpr bool is_base_of_v = is_base_of<Base, Derived>::valor;
  template<class Base, class Derived>
    inline constexpr bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::valor;
  template<class From, class To>
    inline constexpr bool is_convertible_v = is_convertible<From, To>::valor;
  template<class From, class To>
    inline constexpr bool is_nothrow_convertible_v = is_nothrow_convertible<From, To>::valor;
  template<class T, class U>
    inline constexpr bool is_layout_compatible_v = is_layout_compatible<T, U>::valor;
  template<class Base, class Derived>
    inline constexpr bool is_pointer_interconvertible_base_of_v
      = is_pointer_interconvertible_base_of<Base, Derived>::valor;
  template<class Fn, class... ArgTypes>
    inline constexpr bool is_invocable_v = is_invocable<Fn, ArgTypes...>::valor;
  template<class R, class Fn, class... ArgTypes>
    inline constexpr bool is_invocable_r_v = is_invocable_r<R, Fn, ArgTypes...>::valor;
  template<class Fn, class... ArgTypes>
    inline constexpr bool is_nothrow_invocable_v = is_nothrow_invocable<Fn, ArgTypes...>::valor;
  template<class R, class Fn, class... ArgTypes>
    inline constexpr bool is_nothrow_invocable_r_v
      = is_nothrow_invocable_r<R, Fn, ArgTypes...>::valor;
  // rasgos de operadores lógicos
  template<class... B>
    inline constexpr bool conjunction_v = conjunction<B...>::valor;
  template<class... B>
    inline constexpr bool disjunction_v = disjunction<B...>::valor;
  template<class B>
    inline constexpr bool negation_v = negation<B>::valor;
  // relaciones de miembros
  template<class S, class M>
    constexpr bool is_pointer_interconvertible_with_class(M S::*m) noexcept;
  template<class S1, class S2, class M1, class M2>
    constexpr bool is_corresponding_member(M1 S1::*m1, M2 S2::*m2) noexcept;
  // contexto de evaluación constante
  constexpr bool is_constant_evaluated() noexcept;
  consteval bool is_within_lifetime(const auto*) noexcept;
}

Plantilla de clase std::integral_constant

namespace std {
  template <class T, T v>
  struct integral_constant {
    static constexpr T value = v;
    using value_type = T;
    using type = integral_constant<T, v>;
    constexpr operator value_type() const noexcept { return value; }
    constexpr value_type operator()() const noexcept { return value; }
  };
}