C++ Lambda 表达式:中括号捕获列表详解
在 C++ 中,Lambda 表达式是一个匿名函数,它允许您在代码中定义并使用函数,而无需显式地命名它们。Lambda 表达式的前置中括号 [] 用于定义捕获列表,用来指定 Lambda 表达式需要访问的外部变量。
捕获列表可以包含以下选项:
-
空捕获列表:
[]表示 Lambda 表达式不使用任何外部变量。 -
值捕获列表:
[var1, var2, ... ]表示 Lambda 表达式会使用指定的外部变量,并将其值复制到 Lambda 表达式内部。 -
引用捕获列表:
[&var1, &var2, ... ]表示 Lambda 表达式会使用指定的外部变量,并将其作为引用传递到 Lambda 表达式内部。 -
混合捕获列表:
[var1, &var2, ... ]表示 Lambda 表达式会使用指定的外部变量,并将其中一些作为值传递,另一些作为引用传递到 Lambda 表达式内部。 -
this指针捕获列表:[this]表示 Lambda 表达式会使用当前对象的成员变量,并将this指针复制到 Lambda 表达式内部。
捕获列表中的变量可以是局部变量、函数参数、成员变量等。在 Lambda 表达式内部,可以像使用普通变量一样使用这些变量。
代码示例
以下是一些 Lambda 表达式捕获列表的示例:
- 空捕获列表的示例:
[]() { std::cout << 'Hello, world!' << std::endl; }();
- 值捕获列表的示例:
int x = 10;
auto lambda = [x]() { std::cout << "x = " << x << std::endl; };
lambda();
- 引用捕获列表的示例:
int x = 10;
auto lambda = [&x]() { x++; std::cout << "x = " << x << std::endl; };
lambda();
- 混合捕获列表的示例:
int x = 10, y = 20;
auto lambda = [x, &y]() { x++; y++; std::cout << "x = " << x << ", y = " << y << std::endl; };
lambda();
this指针捕获列表的示例:
class MyClass { public: void printX() { auto lambda = [this]() { std::cout << "x = " << x << std::endl; }; lambda(); } private: int x = 10; };
MyClass obj;
obj.printX();
- 函数参数作为捕获列表变量的示例:
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 表达式的灵活性,编写更简洁高效的代码。
原文地址: https://www.cveoy.top/t/topic/jJgo 著作权归作者所有。请勿转载和采集!