下面的代码片段来自c++模板第二版。
template<typename T1, typename T2>
auto max (T1 a, T2 b)
{
return b < a ? a : b;
}
template<typename RT, typename T1, typename T2>
RT max (T1 a, T2 b)
{
return b < a ? a : b;
}
auto b = ::max<long double>(7.2, 4); // uses second template
我的问题是为什么::max(7.2, 4)使用第二个模板?两个函数模板不应该匹配,因为长双精度可以是T1或RT的类型?有提示吗?谢谢!
对于第一个过载,如果指定T1
为long double
,传递7.2
为double
,则需要从double
隐式转换为long double
。对于第二个重载,RT
被指定为long double
,而T1
将被推导为double
,因此它是精确匹配的,并且在重载解析中获胜。
如果指定模板参数为double
和::max<double>(7.2, 4);
,则它们都是精确匹配的,因此调用将是二义性的。
我认为这是因为T1
和T2
可以由编译器自动作为你传递给(7.2,4)
的参数(T1
现在将是double
和T2
现在将是int
或long
),但你还包括另一个类型名(你没有任何其他接受一个类型名的过载),所以编译器认为long double
是第二个过载的第一个参数,并自动其他两个。