自动扣除不一致

inconsistent deduction for auto

本文关键字:不一致      更新时间:2023-10-16

有人可以向我解释为什么以下代码会出错吗?

#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);
}
">

自动"的扣除不一致:"int",然后"双倍">

为什么这段代码可以正常工作?

#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);
}

比我聪明的人可以引用标准的相关部分,但简短的版本是三元运算符的工作方式与 if/else 不同。 对于第一个示例(if/else(,您有两个不同的return,并且您可能return不同的类型(您在示例中执行此操作(。 该函数必须return单一类型,因此它不知道哪个是正确的(即,是将int提升为double还是将double降级为int(。

在第二个示例中,三元运算符可以根据参数(特别是后两个(找出适当的类型。 在您的示例中,它将始终将结果视为double,因此您的函数知道这是它需要return的。

在第

一种情况下,你有 2 个单独的 return 语句返回不同的数据类型,因为aintbdouble,所以auto不知道要推断哪种数据类型。

在第二种情况下,?:运算符的结果是 1 种特定数据类型,并且只有 1 return语句,因此auto知道要推断哪种数据类型不会混淆。