重载函数模板规则



下面的代码片段来自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的类型?有提示吗?谢谢!

对于第一个过载,如果指定T1long double,传递7.2double,则需要从double隐式转换为long double。对于第二个重载,RT被指定为long double,而T1将被推导为double,因此它是精确匹配的,并且在重载解析中获胜。

如果指定模板参数为double::max<double>(7.2, 4);,则它们都是精确匹配的,因此调用将是二义性的。

我认为这是因为T1T2可以由编译器自动作为你传递给(7.2,4)的参数(T1现在将是doubleT2现在将是intlong),但你还包括另一个类型名(你没有任何其他接受一个类型名的过载),所以编译器认为long double是第二个过载的第一个参数,并自动其他两个。

相关内容

  • 没有找到相关文章

最新更新