# std::unwrap_reference, std::unwrap_ref_decay

From cppreference.com
< cpp‎ | utility‎ | functional

Defined in header `<functional>` |  |
template< class T > struct unwrap_reference; | (1) | (since C++20)
template< class T > struct unwrap_ref_decay : std::unwrap_reference<std::decay_t<T>> {}; | (2) | (since C++20)

1) If `T` is std::reference_wrapper<U> for some type `U`, provides a member typedef `type` that names `U&`; otherwise, provides a member typedef `type` that names `T`.
2) If `T` is std::reference_wrapper<U> for some type `U`, ignoring cv-qualification and referenceness, provides a member typedef `type` that names `U&`; otherwise, provides a member typedef `type` that names `std::decay_t<T>`.

### Member types

Name | Definition
`type` | 1) `U&` if `T` is std::reference_wrapper<U>; `T` otherwise 2) `U&` if `std::decay_t<T>` is std::reference_wrapper<U>; `std::decay_t<T>` otherwise

### Helper types

template<class T> using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type; |  | (since C++20)

### Possible implementation

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

### Notes

`std::unwrap_ref_decay` performs the same transformation as used by std::make_pair and std::make_tuple.

### Example

| This section is incomplete Reason: no example

### See also

reference_wrapper (C++11) | CopyConstructible and CopyAssignable reference wrapper (class template)
make_pair | creates a `pair` object of type, defined by the argument types (function template)
make_tuple | creates a `tuple` object of the type defined by the argument types (function template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/functional/unwrap_reference&oldid=109614"