◐ Shell
clean mode source ↗

std::decay - cppreference.com

De cppreference.com

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