std :: remove_const <t>如何在内部工作

时间:2017-09-27 19:15:47

标签: c++ std typetraits

案例1 std :: remove_const的可能实现是

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

当我使用它们时

std::remove_const<int> // use the first version
std::remove_const<const int> // use the second version

案例2 如果我评论第二个版本

template< class T > struct remove_const          { typedef T type; };
//template< class T > struct remove_const<const T> { typedef T type; };

并使用它们

std::remove_const<int> // use the first version
std::remove_const<const int> // use the first version

在案例1中,编译器如何决定选择第二个版本 const int

2 个答案:

答案 0 :(得分:2)

专业化。

const T版本比通用版本更专业(因为如果类型匹配const T,则匹配通用T; int匹配T但不是const T)。

规则是如果类型匹配两个或更多版本,编译器必须选择更专业的版本。

答案 1 :(得分:2)

这是两个不同版本的模板。这是一个单独的模板(你称之为第一个版本),定义了一个特殊化(你称之为第二个版本)。

因此,当您使用模板时,它始终首先查找模板的定义,然后查找与您正在使用的类型签名匹配的模板的预先存在的特化和实例化。如果它找到匹配的特化(或实例化),则使用它。只有在没有现有的专业化或实例化时才会实例化模板。

因此,当您说remove_const<int>它与模板匹配但与特化不匹配时,它会实例化模板。 remove_const<const int>匹配模板并且也匹配特化,因此它使用特化(它也是一个模板,因此需要实例化,但这是次要的)。

使你的&#34;第二版&#34;名称<后面的> .. remove_const列表是专门化而非新模板。