再帰ラムダ関数のコンパイルの問題を解決する
再帰ラムダ関数を定義しようとすると、次のコードはコンパイルに失敗します。
auto sum = [term,next,&sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
エラーは、使用できないことが原因で発生しますそれ自体をキャプチャするラムダ関数を初期化する場合は「auto」。自動型推論は、キャプチャされた変数に依存するため、ラムダの戻り値の型を決定できません。
この問題を修正するには、次の手順を実行できます:
完全に指定された関数オブジェクト タイプを使用する:
std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
指定関数オブジェクト型により自動型推論の必要がなくなり、コンパイラが戻り値の型を正確に決定できるようになります。
後で関数オブジェクトを初期化します:
std::function<int(int, int)> sum; sum = [term, next, &sum](int a, int b) -> int { if (a > b) return 0; else return term(a) + sum(next(a), b); };
初期値を指定せずに関数オブジェクトを初期化すると、コンパイラが代入でその型を推測できるようになります。ステートメント。
以上が再帰 Lambda 関数がコンパイルに失敗するのはなぜですか? どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。