递归函数中的返回类型推导

时间:2014-02-26 12:07:23

标签: c++ c++14

代码compiles

auto foo(int i) {
  if( i == 1 )
    return i;
  else 
    return foo(i-1)+i ; 
}

关注doesn't c++1y

auto foo(int i) {
  return (i == 1) ? i : foo(i-1)+i ;  
}

为什么编译器不能在第二种情况下推断出返回类型?我在这里错过了一些东西吗?

我知道在第二种情况下(i == 1)之后有一个序列点,但这不应该影响编译,对吗?

2 个答案:

答案 0 :(得分:11)

第一个因为这个规则,latest draft

的7.1.6.4/11而起作用
  

然而,在函数中看到return语句后,返回类型   从该语句中推导出的可以在函数的其余部分中使用,包括在其他return语句中。

因此,返回类型从第一个int语句推导为return;第二个是检查,以确保它也给出int,假设递归调用。{/ p>

第二个不能编译,因为表达式的类型取决于返回类型;所以不能推断出类型。

答案 1 :(得分:6)

递归函数只有在递归调用之前具有非递归返回语句时才能具有自动返回类型。请参阅Return type deduction for normal functions