具有cv和ref类型的模板专业化

时间:2019-02-03 19:40:20

标签: c++ template-meta-programming

为了理解元编程,我创建了一个简单的示例:

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
当我取消注释模板规范时,结果与预期的一样(全部正确)

我的问题是,如果在没有注释的情况下都使用特殊化,为什么第二个为假而没有特殊化的最后一个为真。

1 个答案:

答案 0 :(得分:1)

template <class T> 
struct add_cref { 
    typedef T const& type; 
};

类型为add_cref<int&>::typeT = int&。然后,类型add_cref<int&>::typeint& const &大致相同,这意味着引用int&是const而不是整数本身。

编辑:使用类型add_cref<const int&>::typeT = const int&。然后,类型add_cref<const int&>::typeconst 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&