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}}专业化匹配。
我想知道标准中的哪条规则描述了这个匹配过程。
答案 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&&
部分特化匹配,因此选中它。