这是用于计算最大值的 2 个模板函数
template<typename T>
auto max(T a, T b) {
cout << "Calling 1\n";
return b < a ? a : b;
}
template<typename T1, typename T2>
auto max (T1 a, T2 b) {
cout << "Calling 2\n";
return b < a ? a : b;
}
如果我调用 max 函数如下
max(1, 2);
选择了第一个功能(调用 1)。为什么会这样?在这种情况下,1 和 2 都可以很好地匹配。
最佳答案
这是因为第一个 max
作为第二个更专业max
.
在模板重载解析期间发生的事情是编译器实例化两个模板,然后询问“哪个更专业?”
简而言之,它问,给定重载 A 和重载 B,“我可以使用从 A 推导出的类型实例化 B,反之亦然吗?”如果是这样,那么 A 比 B 更专业(我们可以从 A 到 B,但不能返回)。它以另一种方式做同样的事情。如果两者都可以相互实例化,则是模棱两可的,并且是编译器错误。
实际上,我们不使用 T
的实际类型。 (在这种情况下为 int
),但有些是虚构的( "synthesized type" )。
在您的情况下,第一个模板要求两种类型相同:
template<typename T>
auto max(T a, T b)
所以我们有
max<int>
(或 max<synthesized1>
)我们可以实例化第二个给定的
synthesized1
为 T
?没问题,T1 = synthesized1
和 T2 = synthesized1
.我们可以走另一条路吗?
第二个模板有两个参数,所以它允许
a
和 b
是不同的类型,所以它更通用。它使用两种合成类型进行实例化:template<typename T1, typename T2>
auto max (T1 a, T2 b)
所以,
max<synthesized2, synthesized3>
.我们可以实例化第一个
max<T>
带类型 synthesized2
和 synthesized3
?不,它需要 a
和 b
具有相同的类型。因此第一个模板更专业,编译器选择它。引用 [temp.deduct.partial]标准语
关于c++ - 具有多种可行类型的模板重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332526/