// 检查类型是否为引用类型
// 检查左值引用
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