C++ラムダ式でクロージャを実装するにはどうすればよいですか?

WBOY
リリース: 2024-06-01 17:50:03
オリジナル
369 人が閲覧しました

C++ ラムダ式は、関数スコープ変数を保存し、関数からアクセスできるようにするクロージャーをサポートしています。構文は [capture-list] (parameters) -> return-type { function-body } です。 Capture-list はキャプチャする変数を定義します。[=] を使用してすべてのローカル変数を値によってキャプチャするか、[&] を使用してすべてのローカル変数を参照によってキャプチャするか、[variable1, variable2, ...] を使用して特定の変数をキャプチャすることができます。ラムダ式はキャプチャされた変数にのみアクセスできますが、元の値を変更することはできません。

C++ Lambda 表达式如何实现闭包?

C++ ラムダ式のクロージャ

クロージャは、関数のスコープ外に保存され、関数からアクセスできる関連変数のセットです。 C++ では、クロージャはラムダ式を通じて実装され、関数の実行コンテキストで変数をキャプチャします。

構文

C++ ラムダ式の一般的な構文は次のとおりです:

[capture-list] (parameters) -> return-type { function-body }
ログイン後にコピー

ここで、capture-list はキャプチャされる変数を定義し、次の方法で使用できます: capture-list 定义要捕获的变量,可以采用以下方式:

  • [=]: 捕获所有局部变量按值
  • [&]: 捕获所有局部变量按引用
  • [variable1, variable2, ...]: 按值或引用捕获特定变量

实战案例

让我们考虑一个需要访问其外部函数作用域变量的 Lambda 表达式。以下代码段演示了此功能:

#include <iostream>

int main() {
  int value = 10;
  auto lambda = [value] () {
    std::cout << value << std::endl;
  };

  lambda();  // 输出 10

  return 0;
}
ログイン後にコピー

在这个例子中,Lambda 表达式捕获 value 变量按值,并可以在其函数体内访问。

注意

  • 捕获的变量必须在 Lambda 表达式创建时可访问。
  • Lambda 表达式只能访问捕获的变量,不能修改它们的原始值。
  • C++14 及更高版本支持 Lambda 表达式中捕获动态内存。
  • 使用 mutable
  • [=]: すべてのローカル変数を値によってキャプチャします
  • [&]: すべてのローカル変数を参照によってキャプチャします
  • [variable1, variable2, .. .]: 値または参照によって特定の変数をキャプチャします 🎜🎜🎜🎜 実践的な例 🎜🎜🎜 外側の関数スコープ変数にアクセスする必要がある Lambda 式を考えてみましょう。次のコード スニペットは、この機能を示しています: 🎜rrreee🎜 この例では、ラムダ式は value 変数を値でキャプチャし、関数本体内でアクセスできます。 🎜🎜🎜注🎜🎜
    • ラムダ式の作成時に、キャプチャされた変数にアクセスできる必要があります。 🎜
    • ラムダ式はキャプチャされた変数にのみアクセスでき、元の値を変更することはできません。 🎜
    • C++14 以降では、Lambda 式での動的メモリのキャプチャがサポートされています。 🎜
    • ラムダ式内でキャプチャされた変数の値を変更するには、mutable 修飾子を使用します。 🎜🎜
  • 以上がC++ラムダ式でクロージャを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート