以下代码 编译 :

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

跟随时 , c++1y

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

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

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

有帮助吗?

解决方案

第一个之所以有效,是因为这条规则,7.1.6.4/11 最新草案

一旦 return 但是,在函数中可以看到语句,但是,从该语句中得出的返回类型可以在其余的功能中使用,包括在其他函数中 return 声明。

所以返回类型推导为 int 从一开始 return 陈述;仅检查第二个以确保它也给出 int, ,假设递归调用确实如此。

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

其他提示

递归函数只有在递归呼叫之前具有非递归返回语句,才能具有自动返回类型。请参阅返回型正常功能扣除

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top