gpt4 book ai didi

c++ - 模板函数的重载解析

转载 作者:可可西里 更新时间:2023-11-01 15:04:02 28 4
gpt4 key购买 nike

考虑这段代码:

#include <iostream>

//Number1
template<typename T1, typename T2>
auto max (T1 a, T2 b)
{
std::cout << "auto max(T1 a, T2 b)" <<std::endl;
return b < a ? a : b;
}

//Number2
template<typename RT, typename T1, typename T2>
RT max (T1 a, T2 b)
{
std::cout << "RT max(T1 a, T2 b)" << std::endl;
return b < a ? a : b;
}


int main()
{
auto a = ::max(4, 7.2); //Select Number1

auto b = ::max<double>(4, 7.4); //Select Number2

auto c = ::max<int>(7, 4.); //Compile-time error overload ambiguous

auto c = ::max<double>(7, 4.); //Select Number2

}

auto c = ::max<int>(7, 4.); : 由于以下消息的重载歧义,此行无法编译:

maxdefault4.cpp:9:27: error: call of overloaded 'max(int, double)' is ambiguous
auto c = ::max<int>(7, 4.);
^
maxdefault4.cpp:9:27: note: candidates are:
In file included from maxdefault4.cpp:1:0:
maxdefault4.hpp:4:6: note: auto max(T1, T2) [with T1 = int; T2 = double]
auto max (T1 a, T2 b)
^
maxdefault4.hpp:11:4: note: RT max(T1, T2) [with RT = int; T1 = int; T2 = double]
RT max (T1 a, T2 b)
^

而下面的代码: àuto c = ::max<double>(7, 4.)成功,为什么我们没有相同的错误消息说调用对于 max<double> 是模糊的同理max<int>失败了?

为什么 double没问题吗?

我在“C++ 模板,完整指南”一书中读到模板参数推导没有考虑返回类型,所以为什么 max<int>是模棱两可的,而不是 max<double>

参数推导中真的没有考虑模板函数的返回类型吗?

最佳答案

the template argument deduction does not take the return type into account,

是的。 Template argument deduction基于函数参数执行。

so why max<int> is ambiguous and not max<double>?

给定::max<int>(7, 4.) , 对于第一个重载,第一个模板参数 T1指定为 int , 和 T2推导为 double来自第二个函数参数 4. ,那么实例化将是 double max(int, double) 。对于第二次重载,第一个模板参数 RT指定为 int , T1推导为 int来自 7 , T2推导为 double来自 4. ,那么实例化将是 int max(int, double) Overload resolution也没有考虑返回类型,两个重载都是完全匹配然后是歧义的。

给定::max<double>(7, 4.) , 对于第一个重载,第一个模板参数 T1指定为 double , 和 T2推导为 double来自 4. ,所以实例化将是 double max(double, double) 。对于第二次重载,第一个模板参数 RT指定为 double , T1推导为 int来自 7 , T2推导为 double来自 4. ,那么实例化将是 double max(int, double) 。然后第二次重载在 overload resolution 中获胜因为它是完全匹配,所以第一个需要来自 int隐式转换double对于第一个参数 7 .

关于c++ - 模板函数的重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789497/

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