ホームページ >バックエンド開発 >C++ >C の再帰 Lambda 関数がコンパイル エラーを引き起こすのはなぜですか?また、それらはどのように解決できますか?

C の再帰 Lambda 関数がコンパイル エラーを引き起こすのはなぜですか?また、それらはどのように解決できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-19 18:23:09531ブラウズ

Why Do Recursive Lambda Functions in C   Cause Compilation Errors, and How Can They Be Resolved?

C の再帰的ラムダ関数 : コンパイルのジレンマ

再帰的ラムダ関数を設計する際に、コンパイル エラーが発生する可能性があります。当面の問題を詳しく調べて、その解決策を探ってみましょう。

提供されたラムダ関数 sum は、値の範囲にわたる数学演算の結果、term を累積します。再帰的にするために、参照によって合計ラムダをキャプチャしようとしました: [term, next, &sum](int a, int b)。

ただし、このアプローチではコンパイル エラーが発生します。これは、auto で宣言されたラムダ関数と、完全に指定された型を持つラムダ関数の根本的な違いから生じます。

auto で推論された Lambda 関数は、初期化から型を派生します。ただし、再帰ラムダを作成する場合、ラムダにはまだ独自の型がありません。これにより競合が発生します。ラムダのクロージャはその型を知る必要がありますが、まだ決定していません。

この問題を解決するには、std::function

変更されたコード:

std::function sum;

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

この変更により、コンパイラに必要な型情報が提供されます。これにより、再帰ラムダ関数が意図したとおりにコンパイルおよび実行できるようになります。

以上がC の再帰 Lambda 関数がコンパイル エラーを引き起こすのはなぜですか?また、それらはどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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