# std::remove_reference

From cppreference.com
< cpp‎ | types

Defined in header `<type_traits>` |  |
template< class T > struct remove_reference; |  | (since C++11)

If the type `T` is a reference type, provides the member typedef `type` which is the type referred to by `T`. Otherwise `type` is `T`.

### Member types

Name | Definition
`type` | the type referred by `T` or `T` if it is not a reference

### Helper types

template< class T > using remove_reference_t = typename remove_reference<T>::type; |  | (since C++14)

### Possible implementation

    template< class T > struct remove_reference      {typedef T type;};
    template< class T > struct remove_reference<T&>  {typedef T type;};
    template< class T > struct remove_reference<T&&> {typedef T type;};

### Example

Run this code

    #include <iostream> // std::cout
    #include <type_traits> // std::is_same

    template<class T1, class T2>
    void print_is_same() {
      std::cout << std::is_same<T1, T2>() << '\n';
    }

    int main() {
      std::cout << std::boolalpha;

      print_is_same<int, int>();
      print_is_same<int, int &>();
      print_is_same<int, int &&>();

      print_is_same<int, std::remove_reference<int>::type>();
      print_is_same<int, std::remove_reference<int &>::type>();
      print_is_same<int, std::remove_reference<int &&>::type>();
    }

Output:

    true
    false
    false
    true
    true
    true

### See also

is_reference (C++11) | checks if a type is either a lvalue reference or rvalue reference (class template)
add_lvalue_referenceadd_rvalue_reference (C++11)(C++11) | adds a lvalue or rvalue reference to the given type (class template)
remove_cvref (C++20) | combines std::remove_cv and std::remove_reference (class template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/types/remove_reference&oldid=96668"