有人可以向我解释为什么以下代码会出错吗?
#include <iostream>
using namespace std;
template <typename aa, typename bb>
auto minimum(aa a, bb b)
{
if (a < b) return a;
else return b;
}
int main()
{
cout << minimum(7, 5.1);
}
&#39; auto&#39;:&#39; int&#39;的不一致扣除然后&#39; double&#39;
为什么这段代码没有错误?
#include <iostream>
using namespace std;
template <typename aa, typename bb>
auto minimum(aa a, bb b)
{
return a < b ? a : b;
}
int main()
{
cout << minimum(7, 5.1);
}
答案 0 :(得分:2)
比我聪明的人可以引用标准的相关部分,但简短版本是三元运算符的工作方式与if
/ else
不同。在第一个示例(if
/ else
)中,您有两个不同 return
,而您可能 {{ 1}}不同的类型(你在你的例子中这样做)。该函数必须return
一个类型,因此它不知道哪个是正确的(即,是否将return
提升为int
或将double
降级为{{1} }})。
在第二个例子中,三元运算符可以根据参数(特别是后两个)找出合适的类型。在您的示例中,它始终将结果视为double
,因此您的函数知道int
所需的内容。
答案 1 :(得分:2)
在第一种情况下,您有2个单独的double
语句返回不同的数据类型,因为return
是return
而a
是int
,所以b
不知道要推断出哪种数据类型。
在第二种情况下,double
运算符的结果是1个特定数据类型,并且只有1个auto
语句,因此?:
不知道哪个是混淆要推断的数据类型。