前置依赖:

  1. is_lvalue_reference
  2. is_rvalue_reference

源码实现:

// 检查类型是否为引用类型

// 检查左值引用

template<typename>
    struct is_lvalue_reference
    : public false_type { };

template<typename _Tp>
    struct is_lvalue_reference<_Tp&>
    : public true_type { };

// 检查右值引用

template<typename>
    struct is_rvalue_reference
    : public false_type { };

template<typename _Tp>
    struct is_rvalue_reference<_Tp&&>
    : public true_type { };

// 检查是否为引用类型

template<typename _Tp>
    struct is_reference
    : public __or_< is_lvalue_reference<_Tp>,
                        is_rvalue_reference<_TP>>::type
    { };

测试程序

  	std::cout << "is_reference test = " << std::endl;
    std::cout << "is_lvalue_reference<int&> = " << mySTL::is_lvalue_reference<int&>::value << std::endl;
    std::cout << "is_lvalue_reference<const int&> = " << mySTL::is_lvalue_reference<const int&>::value << std::endl;

    std::cout << "is_rvalue_reference<int&> = " << mySTL::is_rvalue_reference<int&&>::value << std::endl;
    std::cout << "is_rvalue_reference<const int&&> = " << mySTL::is_rvalue_reference<const int&&>::value << std::endl;

    std::cout << "is_reference<int&> = " << mySTL::is_reference<int&>::value << std::endl;
    std::cout << "is_reference<int&&> = " << mySTL::is_reference<int&&>::value << std::endl;
    std::cout << std::endl;

值得注意的是, 结果是

is_reference test: is_lvalue_reference<int&> = 1 is_lvalue_reference<const int&> = 1 is_rvalue_reference<int&> = 1 is_rvalue_reference<const int&&> = 1 is_reference<int&> = 1 is_reference<int&&> = 1

这里我们发现 const 属性的类型也可以被判断成功, 这是因为 const 和 其他类型 可以被模板合并推导为 const type, is_lvalue_reference<const int&> 中 _Tp 会被推导为 const int 然后匹配 _Tp(推导为const int)& , 返回true_type