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 ;
}