函数重载和模板推导优先级

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,如果你在你的模板中添加一个标签类就很容易了。

以上是关于函数重载和模板推导优先级的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中选择重载模板函数时的优先级

函数模板遇上函数重载

C++中函数模板和模板函数的区别

C++ 函数重载,函数模板和函数模板重载,选择哪一个?

函数重载与函数模板 - C++

数据的间距问题(重载+函数模板)