【问题标题】: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 类型将调用哪个版本的函数?

【问题讨论】:

  • 第一个将是更好的匹配,因为它不需要派生到基础的转换。

标签: c++ class templates c++11 overloading


【解决方案1】:

这在标准的第 13.3 节中处理。第 13.3/1 段指出:

这些上下文中的每一个都定义了一组候选函数和 以自己独特的方式列出参数。但是,一旦候选人 函数和参数列表已经确定,选择 最好的函数在所有情况下都是相同的: — 首先, 候选函数——那些具有适当数量的参数和 满足某些其他条件——被选中以形成一组可行的 功能(13.3.2)。 ——然后​​选择最佳可行函数 关于匹配每个所需的隐式转换序列(13.3.3.1) 每个可行函数的相应参数的参数。

第一个匹配更好,因为它不涉及任何隐式转换。

【讨论】:

  • SFINAE 可以用来阻止A,如果你在你的模板中添加一个标签类就很容易了。
猜你喜欢
  • 2023-04-09
  • 2010-11-22
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
  • 2012-10-08
相关资源
最近更新 更多