代码compiles:
auto foo(int i) {
if( i == 1 )
return i;
else
return foo(i-1)+i ;
}
auto foo(int i) {
return (i == 1) ? i : foo(i-1)+i ;
}
为什么编译器不能在第二种情况下推断出返回类型?我在这里错过了一些东西吗?
我知道在第二种情况下(i == 1)
之后有一个序列点,但这不应该影响编译,对吗?
答案 0 :(得分:11)
第一个因为这个规则,latest draft
的7.1.6.4/11而起作用然而,在函数中看到
return
语句后,返回类型 从该语句中推导出的可以在函数的其余部分中使用,包括在其他return
语句中。
因此,返回类型从第一个int
语句推导为return
;第二个是检查,以确保它也给出int
,假设递归调用。{/ p>
第二个不能编译,因为表达式的类型取决于返回类型;所以不能推断出类型。
答案 1 :(得分:6)
递归函数只有在递归调用之前具有非递归返回语句时才能具有自动返回类型。请参阅Return type deduction for normal functions。