# std::unwrap_reference, std::unwrap_ref_decay

< cpp‎ | utility‎ | functional

定义于头文件 `<type_traits>` |  |
定义于头文件 `<functional>` |  |
template< class T > struct unwrap_reference; | (1) | (C++20 起)
template< class T > struct unwrap_ref_decay; | (2) | (C++20 起)

1) 若 `T` 为某类型 `U` 的 std::reference_wrapper<U> ，则提供指名 `U&` 的成员 typedef `type` ；否则提供指名 `T` 的成员 typedef `type` 。
2) 若 `T` 为某类型 `U` 的 std::reference_wrapper<U> ，忽略 cv 限定和引用，则提供指名 `U&` 的成员 typedef `type` ；否则提供指名 `std::decay_t<T>` 的成员 typedef `type` 。

添加此页面上描述的任何模板的特化的程序行为未定义。

### 成员类型

名称 | 定义
`type` | 1) 若 `T` 为 std::reference_wrapper<U> 则为 `U&` ；否则为 `T` 2) 若 `std::decay_t<T>` 为 std::reference_wrapper<U> 则为 `U&` ；否则为 `std::decay_t<T>`

### 辅助类型

template<class T> using unwrap_reference_t = typename unwrap_reference<T>::type; | (1) | (C++20 起)
template<class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; | (2) | (C++20 起)

### 可能的实现

    template <class T>
    struct unwrap_reference { using type = T; };
    template <class U>
    struct unwrap_reference<std::reference_wrapper<U>> { using type = U&; };

    template< class T >
    struct unwrap_ref_decay : std::unwrap_reference<std::decay_t<T>> {};

### 注解

`std::unwrap_ref_decay` 进行与 std::make_pair 及 std::make_tuple 所用者相同的变换。

### 示例

| 本节未完成 原因：暂无示例

### 参阅

reference_wrapper (C++11) | 可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 的引用包装器 (类模板)
make_pair | 创建一个 `pair` 对象，其类型根据各实参类型定义 (函数模板)
make_tuple | 创建一个 `tuple` 对象，其类型根据各实参类型定义 (函数模板)