在 C++ 中,Lambda 表达式是一种创建匿名函数的方式。Lambda 表达式的基本形式如下:
[capture](parameters) -> return_type {
// 函数体
}
其中:
capture 是捕获列表,用于捕获外部变量。parameters 是 Lambda 函数的参数列表。return_type 是 Lambda 函数的返回类型。{} 内是 Lambda 函数的函数体。[capture]捕获列表指定 Lambda 函数能够访问的外部变量。有以下几种捕获方式:
不捕获任何变量: [],Lambda 函数无法访问任何外部变量。
[]() {
// 无法访问外部变量
};
捕获所有局部变量(值传递): [=],Lambda 函数通过值捕获所有局部变量。
int x = 10;
auto lambda = [=]() {
// 可以访问 x 的值,但不能修改
int result = x + 5;
};
捕获所有局部变量(引用传递): [&],Lambda 函数通过引用捕获所有局部变量。
int x = 10;
auto lambda = [&]() {
// 可以访问并修改 x 的值
x = 20;
};
捕获指定的局部变量: [x] 或 [&x],只捕获变量 x,可以通过值或引用捕获。
int x = 10;
auto lambda = [x]() {
// 可以访问 x 的值,但不能修改
int result = x + 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() {
// 类的成员函数
}
};
在这个例子中,[this, x] 捕获了 this 指针和局部变量 x,使得 Lambda 函数可以访问类的成员变量和局部变量 x。