gpt4 book ai didi

c++ - 具有多种可行类型的模板重载解析

转载 作者:行者123 更新时间:2023-12-01 12:59:08 27 4
gpt4 key购买 nike

这是用于计算最大值的 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>)

我们可以实例化第二个给定的 synthesized1T ?没问题, T1 = synthesized1T2 = synthesized1 .

我们可以走另一条路吗?

第二个模板有两个参数,所以它允许 ab是不同的类型,所以它更通用。它使用两种合成类型进行实例化:
template<typename T1, typename T2>
auto max (T1 a, T2 b)

所以, max<synthesized2, synthesized3> .

我们可以实例化第一个 max<T>带类型 synthesized2synthesized3 ?不,它需要 ab具有相同的类型。因此第一个模板更专业,编译器选择它。

引用 [temp.deduct.partial]标准语

关于c++ - 具有多种可行类型的模板重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com