ホームページ >バックエンド開発 >C++ >再帰的 Lambda 関数が「auto」では失敗するのに、完全に指定された型では成功するのはなぜですか?

再帰的 Lambda 関数が「auto」では失敗するのに、完全に指定された型では成功するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-14 21:39:16628ブラウズ

Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?

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,&amp;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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。