ホームページ >バックエンド開発 >C++ >C 0x の再帰 Lambda 関数に明示的な型宣言が必要なのはなぜですか?

C 0x の再帰 Lambda 関数に明示的な型宣言が必要なのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-14 10:39:15928ブラウズ

Why Does a Recursive Lambda Function in C  0x Require Explicit Type Declaration?

C 0x の再帰的ラムダ関数

エラーと解決策

再帰的ラムダを作成しようとして、自動関数の使用中にエラーが発生しました。ラムダの型を推測するためのキーワード。ただし、ラムダの型を std::function として明示的に宣言すると、コードは正常にコンパイルされました。

Reasoning

Auto Type Inference:

auto を使用する場合、コンパイラーは初期化に基づいてラムダの型を推測します。ただし、再帰的ラムダの場合、ラムダ クロージャはキャプチャしている型 (この場合は sum) を知る必要があります。ラムダの型はクロージャの型に依存し、クロージャはラムダの型に依存するため、これにより循環依存関係が作成されます。

明示的な型宣言:

ラムダの型を std::function として宣言します。関数オブジェクト自体は、何が割り当てられているかについて何も「知る」必要がないため、この問題は解決されます。これにより、ラムダのクロージャが型推論に依存せずに適切な型をキャプチャできるようになります。

再帰関数:

修正されたコード セグメント:

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

再帰ラムダ関数が C 0x で完全に実行可能であることを示しています。型推論の問題を解決するには、明示的な型宣言が必要なだけです。

以上がC 0x の再帰 Lambda 関数に明示的な型宣言が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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