Auto を使用した再帰ラムダ関数
auto キーワードを使用して再帰ラムダ関数を定義しようとすると、コンパイル エラーが発生する可能性があります。たとえば、次のラムダ関数について考えてみましょう:
auto sum = [term, next, &sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
このコードでは次のエラーが発生します:
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
問題の理解
この問題は、auto キーワードが初期化からラムダ関数の型を推測するために発生します。ただし、再帰ラムダ関数の場合、ラムダ クロージャはキャプチャしている型を知る必要があり、これは卵が先か鶏が先かの問題です。
解決策: 完全に指定された型を使用する
この問題を解決するには、std::function オブジェクトを使用してラムダ関数の型を明示的に指定します。例:
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); };
この場合、ラムダ関数の型は完全に指定されているため、ラムダ クロージャはキャプチャしている型について完全に知ることができます。
Auto対 完全指定型
再帰ラムダ関数は完全指定型と互換性がありますが、型とは互換性がありません自動を使用した推論。これは、auto では既知の型を持つ初期化が必要ですが、完全に指定された型ではこの知識が必要ないためです。
再帰ラムダ関数の型を明示的に指定することで、コンパイル エラーを回避し、ラムダ クロージャは、キャプチャしている型について正しく通知されます。
以上が再帰的 Lambda 関数が「auto」では失敗するのに、完全に指定された型では成功するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。