C++ 递归函数中的返回类型推断

C++ 递归函数中的返回类型推断,c++,c++14,C++,C++14,以下代码: 在跟踪, 为什么编译器不能在第二种情况下推断返回类型?我是不是错过了什么 我知道在第二种情况下,在(I==1)之后有一个序列点,但这不应该影响编译,对吗?递归函数只有在递归调用之前有一个非递归返回语句时,才能具有自动返回类型。请参阅。由于该规则,第一个有效,即第7.1.6.4/11条 但是,一旦在函数中看到return语句,返回类型 从该语句推导的表达式可用于函数的其余部分,包括其他return语句 因此,从第一条return语句推断返回类型为int;第二个被检查以确保它也给出in

以下代码:

在跟踪,


为什么编译器不能在第二种情况下推断返回类型?我是不是错过了什么


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

递归函数只有在递归调用之前有一个非递归返回语句时,才能具有自动返回类型。请参阅。

由于该规则,第一个有效,即第7.1.6.4/11条

但是,一旦在函数中看到
return
语句,返回类型 从该语句推导的表达式可用于函数的其余部分,包括其他
return
语句

因此,从第一条
return
语句推断返回类型为
int
;第二个被检查以确保它也给出
int
,假设递归调用给出


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

我认为在第一种情况下,编译器从
returni
,只需再次检查第二个
return
语句是否返回相同的类型。在第二个例子中,这是不可能的。但我不确定这一点,即使编译器是这样做的,我也不知道当前提议的措辞需要什么。如果您将第一个示例的逻辑更改为
I!=1
它也不会编译。因此添加
if(false)return int()
可以修复第二个示例吗?对于无法访问的代码来说,这是一个相当令人惊讶的效果。@MSalters是的,我也这么认为
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 ;  
}