[英]Function overloading and template deduction priority
请考虑以下函数声明:
template<typename T> f(const T& x); // Version 1
template<typename T1, typename T2> f(const MyClass<T1, T2>& x); // Version 2
如果我使用与MyClass
无关的类型调用f
,则将调用第一个版本。 如果我用MyClass
类型调用f
(无论模板参数类型是什么),那么将调用第二个版本。 但现在,请考虑:
template<typename T1, typename T2, typename T3>
MyDerivedClass : public MyClass<T1, T2> {};
将为MyDerivedClass
类型调用什么版本的函数?
这在标准的第13.3节中处理。 第13.3 / 1段指出:
这些上下文中的每一个都以其自己独特的方式定义候选函数集和参数列表。 但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的: - 首先,候选函数的子集 - 具有适当数量的参数并满足某些其他条件的函数 - 被选中以形成一组可行的函数(13.3.2)。 - 然后根据将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数。
第一个是更好的匹配,因为它不涉及任何隐式转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.