Following code compiles :
auto foo(int i) {
if( i == 1 )
return i;
else
return foo(i-1)+i ;
}
While following doesn't, c++1y
auto foo(int i) {
return (i == 1) ? i : foo(i-1)+i ;
}
Why can't compiler deduce the return type in second case ? Am I missing something over here ?
I know there's a sequence point after (i == 1)
in second scenario, but that shouldn't be affecting compilation, right ?
A recursive function can have an auto return type only if it has a non-recursive return statement before the recursive call. See Return type deduction for normal functions.
The first works because of this rule, 7.1.6.4/11 of the latest draft
Once a
return
statement has been seen in a function, however, the return type deduced from that statement can be used in the rest of the function, including in otherreturn
statements.
So the return type is deduced as int
from the first return
statement; the second is just checked to make sure that it also gives int
, assuming that the recursive call does.
The second doesn't compile because the type of the expression depends on the return type; so the type can't be deduced.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With