質問
次のコードコンパイル:
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 ;
}
.
第2のケースで戻りタイプを推測できないのはなぜですか?私はここに何かを欠いていますか?
2番目のシナリオの(i == 1)
の後にシーケンスポイントがあることを知っていますが、コンパイルに影響を与えないでください。右?
解決
この規則のために最初の作品、最新のドラフト
関数に
return
ステートメントが表示されたら、戻り型 そのステートメントからの推定は、他のreturn
ステートメントを含む、他の関数で使用できます。
だから戻り値は最初のint
ステートメントからreturn
として推定されます。2番目は、再帰呼び出しが実行していると仮定して、それがint
も与えることを確認するためにチェックされています。
式の種類は戻り型によって異なるため、2番目はコンパイルされません。そのため、タイプは推測できません。
他のヒント
再帰呼び出しの前に再帰的なRETURNステートメントを持っている場合にのみ、再帰関数を自動的に戻すことができます。通常関数の戻り型演繹。
所属していません StackOverflow