尝试用条件运算符理解为什么类型推导在这里失败了 在这种情况下,标准中试图阻止类型推导的东西?任何了解这一点的指针都会很棒。
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);
答案 0 :(得分:4)
mfact
中的问题是三元运算符。该运算符的语义指定表达式的类型是两个条件子表达式的公共类型(我有点解释)。
什么是常见类型?为什么它是int
和......一种类型还有待推断
啊,没问题!推断的类型是什么?这是三元运算符的类型......
我们有鸡和蛋的问题。整个函数定义格式错误,因为无法确定表达式的类型。
mfact2
怎么样?它有两个单独的return语句。第一个是普通整数。由于函数只能有一个返回类型,因此返回类型推导要求两个返回语句不要冲突。
引用C ++ 14标准修订版:
占位符类型可以带有函数声明符 decl-specifier-seq,type-specifier-seq,conversion-function-id或 trailing-return-type,在此类声明符有效的任何上下文中。 如果函数声明符包含trailing-return-type ([dcl.fct]),指定函数的声明返回类型。 如果声明的函数返回类型包含占位符 type,函数的返回类型是从return中推导出来的 函数正文中的语句,(如果有的话)。
因此,推断出类型的一个return语句就足够了,并且:
如果具有声明的返回类型的函数包含占位符 type有多个return语句,推导出返回类型 每个退货声明。如果推断出的类型在每个中都不相同 扣除,该计划是不正确的。
在这个简单的例子中,第一个语句要求它为int
,第二个语句包含递归调用。由于相同的函数重载只能有一个返回类型,因此递归调用也必须是int
类型。两个回复声明同意。