c ++类型推断递归函数

时间:2017-07-30 17:20:20

标签: c++ auto

尝试用条件运算符理解为什么类型推导在这里失败了 在这种情况下,标准中试图阻止类型推导的东西?任何了解这一点的指针都会很棒。

auto mfact(int i)
{
    return (0==i) ? 1 : i * mfact(i-1);
}

auto mfact2(int i)
{
    if (0 == i)
        return 1;

    else
        return i * mfact2(i-1);
}
error: use of ‘auto mfact(int)’ before deduction of ‘auto’    
    return (0==i) ? 1 : i * mfact(i-1);

1 个答案:

答案 0 :(得分:4)

mfact中的问题是三元运算符。该运算符的语义指定表达式的类型是两个条件子表达式的公共类型(我有点解释)。

什么是常见类型?为什么它是int和......一种类型还有待推断 啊,没问题!推断的类型是什么?这是三元运算符的类型......

我们有鸡和蛋的问题。整个函数定义格式错误,因为无法确定表达式的类型。

mfact2怎么样?它有两个单独的return语句。第一个是普通整数。由于函数只能有一个返回类型,因此返回类型推导要求两个返回语句不要冲突。

引用C ++ 14标准修订版:

[dcl.spec.auto/2]

  

占位符类型可以带有函数声明符   decl-specifier-seq,type-specifier-seq,conversion-function-id或   trailing-return-type,在此类声明符有效的任何上下文中。   如果函数声明符包含trailing-return-type   ([dcl.fct]),指定函数的声明返回类型。   如果声明的函数返回类型包含占位符   type,函数的返回类型是从return中推导出来的   函数正文中的语句,(如果有的话)。

因此,推断出类型的一个return语句就足够了,并且:

[dcl.spec.auto/9]

  

如果具有声明的返回类型的函数包含占位符   type有多个return语句,推导出返回类型   每个退货声明。如果推断出的类型在每个中都不相同   扣除,该计划是不正确的。

在这个简单的例子中,第一个语句要求它为int,第二个语句包含递归调用。由于相同的函数重载只能有一个返回类型,因此递归调用也必须是int类型。两个回复声明同意。

相关问题