C ++ 11标准中的哪条规则描述了下面提到的匹配?

时间:2014-07-25 18:03:45

标签: c++ templates c++11

std::remove_reference使用以下实现:

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

因此,如果std::remove_reference<int&>int&T&类型将匹配std::remove_reference<int&&>专精。如果我们使用int&&,则T&&类型与{{1}}专业化匹配。

我想知道标准中的哪条规则描述了这个匹配过程。

1 个答案:

答案 0 :(得分:9)

§14.5.5.1/ 1

  

当在需要实例化类的上下文中使用类模板时,有必要这样做   确定是使用主模板还是部分模板之一生成实例化   专业化。这是通过匹配类模板特化的模板参数来完成的   部分特化的模板参数列表。

     

- 如果找到一个匹配的特化,则从该特化生成实例化。

     

- 如果找到多个匹配专业化,则使用偏序规则(14.5.5.2)来确定其中一个专业化是否比其他专业化更专业化。如果没有专业化   比所有其他匹配的特化更专业,然后使用类模板   暧昧,程序结构不合理。

     

- 如果未找到匹配项,则从主模板生成实例化。

匹配通过类似于函数模板参数推导的过程发生。 §14.5.5.1/ 2:

  

如果是模板参数,则部分特化匹配给定的实际模板参数列表   部分特化可以从实际模板参数列表中推导出来(14.8.2)。 ...

对于std::remove_reference<int&>T&部分特化匹配,因此选中它。对于std::remove_reference<int&&>,只有T&&部分特化匹配,因此选中它。