自动

时间:2018-03-11 16:49:20

标签: c++ templates auto

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

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

2 个答案:

答案 0 :(得分:2)

比我聪明的人可以引用标准的相关部分,但简短版本是三元运算符的工作方式与if / else不同。在第一个示例(if / else)中,您有两个不同 return,而您可能 {{ 1}}不同的类型(你在你的例子中这样做)。该函数必须return一个类型,因此它不知道哪个是正确的(即,是否将return提升为int或将double降级为{{1} }})。

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

答案 1 :(得分:2)

在第一种情况下,您有2个单独的double语句返回不同的数据类型,因为returnreturnaint,所以b不知道要推断出哪种数据类型。

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