• Lambda 表达式捕获列表


    在 C++ 中,Lambda 表达式是一种创建匿名函数的方式。Lambda 表达式的基本形式如下:

    [capture](parameters) -> return_type {
        // 函数体
    }
    
    • 1
    • 2
    • 3

    其中:

    • capture 是捕获列表,用于捕获外部变量。
    • parameters 是 Lambda 函数的参数列表。
    • return_type 是 Lambda 函数的返回类型。
    • {} 内是 Lambda 函数的函数体。

    捕获列表 [capture]

    捕获列表指定 Lambda 函数能够访问的外部变量。有以下几种捕获方式:

    1. 不捕获任何变量: [],Lambda 函数无法访问任何外部变量。

      []() {
          // 无法访问外部变量
      };
      
      • 1
      • 2
      • 3
    2. 捕获所有局部变量(值传递): [=],Lambda 函数通过值捕获所有局部变量。

      int x = 10;
      auto lambda = [=]() {
          // 可以访问 x 的值,但不能修改
          int result = x + 5;
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
    3. 捕获所有局部变量(引用传递): [&],Lambda 函数通过引用捕获所有局部变量。

      int x = 10;
      auto lambda = [&]() {
          // 可以访问并修改 x 的值
          x = 20;
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
    4. 捕获指定的局部变量: [x][&x],只捕获变量 x,可以通过值或引用捕获。

      int x = 10;
      auto lambda = [x]() {
          // 可以访问 x 的值,但不能修改
          int result = x + 5;
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5

    this 指针

    在 Lambda 表达式中,this 指针的含义取决于捕获列表。默认情况下,Lambda 函数不能访问类的成员变量和成员函数,但是可以通过 [this] 捕获 this 指针,使 Lambda 函数能够访问类的成员。

    class MyClass {
    public:
        void example() {
            int x = 10;
            auto lambda = [this, x]() {
                // 可以访问类的成员变量和 x
                int result = memberVar + x;
                memberFunction();
            };
            lambda();
        }
    
    private:
        int memberVar = 42;
    
        void memberFunction() {
            // 类的成员函数
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这个例子中,[this, x] 捕获了 this 指针和局部变量 x,使得 Lambda 函数可以访问类的成员变量和局部变量 x

  • 相关阅读:
    【Python基础】数据容器的切片操作和集合
    2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
    国际啤酒节真好玩,有中兴通讯在还不用怕没网!
    Socket通信
    必备元器件知识1——电阻
    C++对象模型(11)-- 虚基类
    Qt编写物联网管理平台43-告警短信转发
    Dasviewer软件在浏览模型时能通过经纬度定位点吗?
    vue3实现H5网页录音并上传(mp3、wav)兼容Android、iOS和PC端
    octave 与 matlab
  • 原文地址:https://blog.csdn.net/qq_39054069/article/details/134514135