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

P0W*_*P0W 8 c++ c++14

以下代码编译:

auto foo(int i) {
  if( i == 1 )
    return i;
  else 
    return foo(i-1)+i ; 
}
Run Code Online (Sandbox Code Playgroud)

虽然以下没有,但c ++ 1y

auto foo(int i) {
  return (i == 1) ? i : foo(i-1)+i ;  
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*our 12

第一个工作是因为这个规则,最新草案的 7.1.6.4/11

return但是,一旦在函数中看到了语句,从该语句推导出的返回类型就可以在函数的其余部分中使用,包括在其他return语句中.

所以返回类型是int从第一个return语句中推导出来的; 第二个只是检查以确保它也给出int,假设递归调用.

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


Mar*_*ila 6

只有在递归调用之前它具有非递归返回语句时,递归函数才能具有自动返回类型.请参阅正常功能的返回类型扣除.