Espacios de nombres
Variantes

std::decay

De cppreference.com
 
 
Biblioteca de servicios
 
Apoyo de tipos
Tipos básicos
Tipos fundamentales
Tipos enteros de anchura fija (C++11)
Límites numéricos
Interfaz de C de límites numéricos
Información de tipo
en tiempo de ejecución
Rasgos de tipos
Categorías de tipos
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
Operaciones soportadas
Relaciones y consultas de propiedades
Modificaciones de tipos
(C++11)(C++11)(C++11)
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
(C++11)(hasta C++20)(C++17)
 
Definido en el archivo de encabezado <type_traits>
template< class T > struct decay;
(desde C++11)

Aplica conversiones implícitas de lvalue a rvalue, array a puntero y función a puntero al tipo T, elimina los calificadores-cv y define el tipo resultante como el miembro typedef type. Formalmente:

  • Si T nombra el tipo "array de U" o "referencia al array de U", el miembro typedef type es U*.
  • De lo contrario, si T es un tipo función F o una referencia al mismo, el miembro typedef type es std::add_pointer <F>::type.
  • De lo contrario, el miembro typedef type es std::remove_cv<std::remove_reference<T>::type>::type.

Estas conversiones modelan la conversión de tipo aplicada a todos los argumentos de función cuando se pasan por valor.

El comportamiento de un programa que añade especializaciones para decay no está definido.

Tipos miembro

Nombre Definición
type El resultado de aplicar las conversiones de decadencia de tipo a T

Tipos auxiliares

template< class T > using decay_t = typename decay<T>::type;
(desde C++14)

Posible implementación

template< class T >
struct decay {
private:
    typedef typename std::remove_reference<T>::type U;
public:
    typedef typename std::conditional< 
        std::is_array<U>::value,
        typename std::remove_extent<U>::type*,
        typename std::conditional< 
            std::is_function<U>::value,
            typename std::add_pointer<U>::type,
            typename std::remove_cv<U>::type
        >::type
    >::type type;
};

Ejemplo

#include <iostream>
#include <type_traits>

template <typename T, typename U>
struct decay_equiv : 
    std::is_same<typename std::decay<T>::type, U>::type 
{};

int main()
{
    std::cout << std::boolalpha
              << decay_equiv<int, int>::value << '\n'
              << decay_equiv<int&, int>::value << '\n'
              << decay_equiv<int&&, int>::value << '\n'
              << decay_equiv<const int&, int>::value << '\n'
              << decay_equiv<int[2], int*>::value << '\n'
              << decay_equiv<int(int), int(*)(int)>::value << '\n';
}

Salida:

true
true
true
true
true
true

Véase también

Combina std::remove_cv y std::remove_reference.
(plantilla de clase) [editar]
Conversión implícita Conversiones de array a puntero, de función a puntero, de l-valor a r-valor.