功能重载和模板扣除优先级

时间:2012-12-16 10:58:07

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

考虑以下函数声明:

template<typename T> f(const T& x); // Version 1
template<typename T1, typename T2> f(const MyClass<T1, T2>& x); // Version 2

如果我使用与f无关的类型调用MyClass,则会调用第一个版本。如果我使用f类型调用MyClass(无论模板参数类型是什么),那么将调用第二个版本。但现在,请考虑:

template<typename T1, typename T2, typename T3>
MyDerivedClass : public MyClass<T1, T2> {};

将为MyDerivedClass类型调用哪个版本的函数?

1 个答案:

答案 0 :(得分:5)

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

  

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

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