# std::decay

< cpp‎ | types

定义于头文件 `<type_traits>` |  |
template< class T > struct decay; |  | (C++11 起)

对类型 `T` 应用左值到右值、数组到指针及函数到指针隐式转换，移除 cv 限定符，并定义结果类型为成员 typedef `type` 。正式而言：

- 若`T` 指名“ `U` 的数组”或“到 `U` 的数组的引用”类型，则成员 typedef `type` 为 U* 。

- 否则，若 `T` 为函数类型 `F` 或到它的引用，则成员 typedef `type` 为std::add_pointer<F>::type 。

- 否则，成员 typedef `type` 为 std::remove_cv<std::remove_reference<T>::type>::type 。

这些转换模仿在以值传递时，应用到所有函数参数的类型转换。

添加 `decay` 的特化的程序行为未定义。

### 成员类型

名称 | 定义
`type` | 应用退化类型转换到 `T` 的结果

### 辅助类型

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

### 可能的实现

    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;
    };

### 示例

    #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';
    }

输出：

    true
    true
    true
    true
    true
    true

### 参阅

remove_cvref (C++20) | 将 std::remove_cv 与 std::remove_reference 结合 (类模板)
隐式转换 | 数组到指针、函数到指针、左值到右值转换