std::remove_reference(3)

NAME
std::remove_reference - std::remove_reference

Synopsis
   Defined in header <type_traits>
   template< class T > (since C++11)
   struct remove_reference;
   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.
   The behavior of a program that adds specializations for remove_reference is
   undefined.

Member types
   Name Definition
   type the type referred by T or T if it is not a reference

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

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>
 #include <type_traits>
 int main() {
     std::cout << std::boolalpha;
     std::cout << "std::remove_reference<int>::type is int? "
               << std::is_same<int, std::remove_reference<int>::type>::value << '\n';
     std::cout << "std::remove_reference<int&>::type is int? "
               << std::is_same<int, std::remove_reference<int&>::type>::value << '\n';
     std::cout << "std::remove_reference<int&&>::type is int? "
               << std::is_same<int, std::remove_reference<int&&>::type>::value << '\n';
     std::cout << "std::remove_reference<const int&>::type is const int? "
               << std::is_same<const int,
                        std::remove_reference<const int&>::type>::value << '\n';
 }

Output:
 std::remove_reference<int>::type is int? true
 std::remove_reference<int&>::type is int? true
 std::remove_reference<int&&>::type is int? true
 std::remove_reference<const int&>::type is const int? true

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