为了理解元编程,我创建了一个简单的示例:
template <class T> struct add_cref { typedef T const& type; };
// template <class T> struct add_cref<T&> { typedef T const& type; };
std::cout << std::boolalpha
<< std::is_same<add_cref<int>::type, int const&>::value << std::endl
<< std::is_same<add_cref<int&>::type, int const&>::value << std::endl
<< std::is_same<add_cref<const int>::type, int const&>::value << std::endl
<< std::is_same<add_cref<int const&>::type, int const&>::value << std::endl;
结果为: true,false,true,true
当我取消注释模板规范时,结果与预期的一样(全部正确)
我的问题是,如果在没有注释的情况下都使用特殊化,为什么第二个为假而没有特殊化的最后一个为真。
答案 0 :(得分:1)
template <class T>
struct add_cref {
typedef T const& type;
};
类型为add_cref<int&>::type
,T = int&
。然后,类型add_cref<int&>::type
与int& const &
大致相同,这意味着引用int&
是const而不是整数本身。
编辑:使用类型add_cref<const int&>::type
,T = const int&
。然后,类型add_cref<const int&>::type
与const int& const &
大致相同,这意味着引用本身const int&
是const(编译器将忽略第二个const),但它引用的是{{1 }}。这意味着const int
必须为add_cref<const int&>::type
,即使没有专门化。
具有专长:
const int&
对于template <class T>
struct add_cref<T&> {
typedef T const& type;
};
,因为在此专业领域add_cref<int&>
,然后T&=int&
。
结果,T=int
中的type
变成了T const&
。