在 C++ 中,Lambda 表达式是一个匿名函数,它允许您在代码中定义并使用函数,而无需显式地命名它们。Lambda 表达式的前置中括号 [] 用于定义捕获列表,用来指定 Lambda 表达式需要访问的外部变量。

捕获列表可以包含以下选项:

  1. 空捕获列表:[] 表示 Lambda 表达式不使用任何外部变量。

  2. 值捕获列表:[var1, var2, ... ] 表示 Lambda 表达式会使用指定的外部变量,并将其值复制到 Lambda 表达式内部。

  3. 引用捕获列表:[&var1, &var2, ... ] 表示 Lambda 表达式会使用指定的外部变量,并将其作为引用传递到 Lambda 表达式内部。

  4. 混合捕获列表:[var1, &var2, ... ] 表示 Lambda 表达式会使用指定的外部变量,并将其中一些作为值传递,另一些作为引用传递到 Lambda 表达式内部。

  5. this 指针捕获列表:[this] 表示 Lambda 表达式会使用当前对象的成员变量,并将 this 指针复制到 Lambda 表达式内部。

捕获列表中的变量可以是局部变量、函数参数、成员变量等。在 Lambda 表达式内部,可以像使用普通变量一样使用这些变量。

代码示例

以下是一些 Lambda 表达式捕获列表的示例:

  1. 空捕获列表的示例:
[]() {    std::cout << 'Hello, world!' << std::endl; }();
  1. 值捕获列表的示例:
int x = 10;
auto lambda = [x]() {    std::cout << "x = " << x << std::endl; };
lambda();
  1. 引用捕获列表的示例:
int x = 10;
auto lambda = [&x]() {    x++;    std::cout << "x = " << x << std::endl; };
lambda();
  1. 混合捕获列表的示例:
int x = 10, y = 20;
auto lambda = [x, &y]() {    x++;    y++;    std::cout << "x = " << x << ", y = " << y << std::endl; };
lambda();
  1. this 指针捕获列表的示例:
class MyClass { public:    void printX() {        auto lambda = [this]() {            std::cout << "x = " << x << std::endl;        };        lambda();    } private:    int x = 10; };
MyClass obj;
obj.printX();
  1. 函数参数作为捕获列表变量的示例:
int add(int x, int y) {    auto lambda = [x, y]() {        std::cout << "x + y = " << x + y << std::endl;    };    lambda();    return x + y; }
add(2, 3);

lambda() 的含义

lambda() 是调用 Lambda 表达式的语法,相当于执行 Lambda 表达式内部的代码。在示例中,Lambda 表达式没有参数,因此 lambda() 中没有传递任何参数。

总结

捕获列表是 Lambda 表达式的重要组成部分,它允许 Lambda 表达式访问外部变量并进行操作。通过理解不同的捕获方式,您可以更好地利用 Lambda 表达式的灵活性,编写更简洁高效的代码。

C++ Lambda 表达式:中括号捕获列表详解

原文地址: https://www.cveoy.top/t/topic/jJgo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录