アジの開きを閉じる。

競プロ(AtCoder)中心のブログ

【C++】ラムダ式の再帰では戻り値の型を書く

ラムダ式再帰をしたい場合は,戻り値の型を明示した方が安全そう.

戻り値の型を明示しない次のコードは正常に動作する.

正常に動作するラムダ式再帰

一方,14-15行目を削除した次のコードは怒られる.

怒られるラムダ式再帰

error: use of ‘main()::<lambda(auto:23, int, int)> [with auto:23 = main()::<lambda(auto:23, int, int)>]’ before deduction of ‘auto’
   17 |       f(f,nxt,now);
      |       ~^~~~~~~~~~~

エラー内容は「'auto'の推論前にautoを使用しているよ」という内容.
型が確定する前のautoを使用しているから怒られているっぽい.

ラムダ式の内部で,再帰呼び出し前にreturn文があると怒られず,無いと怒られる.

C++の仕様を調べたが,なぜなのかはよく分からず.
この辺りが関係しそう.

ちなみに,戻り値の型を明示すると怒られなくなる.

戻り値を明示すると怒られない

上記のことを気にしなくて済むように,常に返り値の型を明示する癖を付けておけば良さそう.