ホームページ >バックエンド開発 >C++ >再帰 Lambda 関数がコンパイルに失敗するのはなぜですか? どうすれば修正できますか?

再帰 Lambda 関数がコンパイルに失敗するのはなぜですか? どうすれば修正できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-13 13:46:11870ブラウズ

Why Does My Recursive Lambda Function Fail to Compile, and How Can I Fix It?

再帰ラムダ関数のコンパイルの問題を解決する

再帰ラムダ関数を定義しようとすると、次のコードはコンパイルに失敗します。

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」。自動型推論は、キャプチャされた変数に依存するため、ラムダの戻り値の型を決定できません。

この問題を修正するには、次の手順を実行できます:

  1. 完全に指定された関数オブジェクト タイプを使用する:

    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);
    };

    指定関数オブジェクト型により自動型推論の必要がなくなり、コンパイラが戻り値の型を正確に決定できるようになります。

  2. 後で関数オブジェクトを初期化します:

    std::function<int(int, int)> sum;
    
    sum = [term, next, &amp;sum](int a, int b) -> int {
        if (a > b)
            return 0;
        else
            return term(a) + sum(next(a), b);
    };

    初期値を指定せずに関数オブジェクトを初期化すると、コンパイラが代入でその型を推測できるようになります。ステートメント。

以上が再帰 Lambda 関数がコンパイルに失敗するのはなぜですか? どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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