一、基本表达方法
Lambda 表达式的基本语法如下: Lambda 表达式由以下部分组成:
捕获列表(Capture clause):用于捕获外部变量,在 Lambda 表达式中可以访问这些变量。捕 获列表可以为空,也可以包含变量列表 [var1, var2, ...] 。
参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表 (param1, param2, ...) 。
返回类型(Return type):Lambda 表达式可以自动推断返回类型auto,也可以显式指定返回类 型 -> return_type 。如果函数体只有一条返回语句,可以省略返回类型。
函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。
二、命名示例
#include <iostream>
#include <functional>
int main() {
// 定义一个Lambda表达式,并将其赋值给auto类型的变量add
auto add = [] (int x, int y) -> int {
return x + y;
};
// 使用Lambda函数
int result = add(10, 20);
std::cout << "Result: " << result << std::endl;
// Lambda也可以作为参数传递给其他函数
std::function<int(int, int)> sum = add;
int another_result = sum(5, 15);
std::cout << "Another Result: " << another_result << std::endl;
return 0;
}
三、关于捕获列表的用法
-
按值捕获(Value Capture):使用
=
捕获列表前缀,Lambda会复制外部作用域中的所有变量。这类似于在Lambda表达式的函数体内访问局部变量的副本。示例:
1 int x = 10; 2 auto lambda = [=]() { 3 std::cout << x << std::endl; // 访问x的副本 4 };
-
按引用捕获(Reference Capture):使用
&
前缀,Lambda会直接引用外部作用域中的变量。这允许在Lambda函数体内修改外部变量。示例:
1 int x = 10; 2 auto lambda = [&]() { 3 x++; // 直接修改外部作用域中的x 4 };
-
捕获单个变量:在捕获列表中指定具体的变量名,可以按值或按引用捕获。
示例:
1 int x = 10; 2 auto lambda = [x]() { 3 std::cout << x << std::endl; // 按值捕获x 4 }; 5 6 int y = 20; 7 auto lambda2 = [&y]() { 8 y++; // 按引用捕获y 9 };
-
捕获this指针:如果在一个成员函数中使用Lambda,并且Lambda需要访问类的成员,可以显式地捕获
this
指针。示例:
1 class MyClass { 2 public: 3 int x; 4 void myFunc() { 5 auto lambda = [this]() { 6 std::cout << this->x << std::endl; // 捕获this指针 7 }; 8 } 9 };