函数重载和模板推导优先级
Posted
技术标签:
【中文标题】函数重载和模板推导优先级【英文标题】:Function overloading and template deduction priority 【发布时间】:2012-12-03 17:59:09 【问题描述】:考虑以下函数声明:
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
类型将调用哪个版本的函数?
【问题讨论】:
第一个将是更好的匹配,因为它不需要派生到基础的转换。 【参考方案1】:这在标准的第 13.3 节中处理。第 13.3/1 段指出:
这些上下文中的每一个都定义了一组候选函数和 以自己独特的方式列出参数。但是,一旦候选人 函数和参数列表已经确定,选择 最好的函数在所有情况下都是相同的: — 首先, 候选函数——那些具有适当数量的参数和 满足某些其他条件——被选中以形成一组可行的 功能(13.3.2)。 ——然后选择最佳可行函数 关于匹配每个所需的隐式转换序列(13.3.3.1) 每个可行函数的相应参数的参数。
第一个匹配更好,因为它不涉及任何隐式转换。
【讨论】:
SFINAE 可以用来阻止A,如果你在你的模板中添加一个标签类就很容易了。以上是关于函数重载和模板推导优先级的主要内容,如果未能解决你的问题,请参考以下文章