# std::remove_reference

< cpp‎ | types

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

若类型 `T` 为引用类型，则提供成员 typedef `type` ，其为 `T` 所引用的类型。否则 `type` 为 `T` 。

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

### 成员类型

名称 | 定义
`type` | `T` 所引用的类型，或若 `T` 不是引用则为 `T`

### 辅助类型

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

### 可能的实现

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

### 示例

    #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>();
    }

输出：

    true
    false
    false
    true
    true
    true

### 参阅

is_reference (C++11) | 检查类型是否为左值引用或右值引用 (类模板)
add_lvalue_reference add_rvalue_reference (C++11)(C++11) | 向给定类型添加左值或右值引用 (类模板)
remove_cvref (C++20) | 将 std::remove_cv 与 std::remove_reference 结合 (类模板)