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

Vin*_*ent 4 c++ templates overloading class c++11

请考虑以下函数声明:

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

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

template<typename T1, typename T2, typename T3>
MyDerivedClass : public MyClass<T1, T2> {};
Run Code Online (Sandbox Code Playgroud)

将为MyDerivedClass类型调用什么版本的函数?

And*_*nck 5

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

这些上下文中的每一个都以其自己独特的方式定义候选函数集和参数列表.但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的: - 首先,候选函数的子集 - 具有适当数量的参数并满足某些其他条件的函数 - 被选中以形成一组可行的函数(13.3.2). - 然后根据将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数.

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