【发布时间】:2025-11-27 20:05:03
【问题描述】:
以下sn-p来自C++模板第2版一书。
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) 使用第二个模板?两个函数模板不应该匹配吗,因为 long double 可以是 T1 或 RT 的类型?有什么提示吗?谢谢!
【问题讨论】:
-
7.2是double,而不是long double。所以第二个模板是更好的匹配。 -
但是对于第二个模板,返回值也应该是
long double,这也需要从double或int隐式转换为long double,这样对于第一个或第二个,都有是隐式转换吗? -
是的。但是返回值/类型在模板推导中不起作用。只有参数传递给函数。在选择使用哪个重载时,甚至从不查看函数的主体。只有函数签名。
标签: c++ templates overload-resolution function-templates