【问题标题】:inconsistent deduction for auto [duplicate]自动扣除不一致[重复]
【发布时间】:2018-03-11 16:49:20
【问题描述】:

谁能解释一下为什么下面的代码会出错?

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

'auto' 的推导不一致:'int' 然后 'double'

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

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

【问题讨论】:

  • 要使用多个返回语句进行推导,所有返回语句中的类型必须匹配。没有自动升级到普通类型或类似的东西。 OTOH 在三元运算符中,在任何推导有机会发生之前,会自动将 tge 两个分支转换为公共类型。

标签: c++ templates auto


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    在第二种情况下,?:运算符的结果是1个特定的数据类型,而return语句只有1个,所以auto不知道要推导出哪个数据类型。

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多