在 C++ 中,lambda 表达式的捕获列表(capture list)不仅限于 [&]
、[=]
和 []
,还有其他形式可以更灵活地控制捕获行为。以下是 C++ lambda 表达式捕获列表的完整形式及其用法:
[]
int x = 10;
auto lambda = []() {
// 不能使用 x,因为没有捕获
return 42;
};
[&]
int x = 10;
auto lambda = [&]() {
x = 20; // 修改外部变量 x
return x;
};
lambda();
std::cout << x; // 输出: 20
[=]
int x = 10;
auto lambda = [=]() {
// x 是只读的,不能修改
return x + 1;
};
std::cout << lambda(); // 输出: 11
std::cout << x; // 输出: 10(未被修改)
[&x, &y]
int x = 10, y = 20;
auto lambda = [&x, &y]() {
x = 30;
y = 40;
};
lambda();
std::cout << x << " " << y; // 输出: 30 40
[x, y]
int x = 10, y = 20;
auto lambda = [x, y]() {
// x 和 y 是只读的
return x + y;
};
std::cout << lambda(); // 输出: 30
int x = 10, y = 20;
auto lambda = [&x, y]() {
x = 30; // 修改 x(按引用捕获)
// y 是只读的(按值捕获)
return x + y;
};
lambda();
std::cout << x << " " << y; // 输出: 30 20
[&, x]
或 [=, &x]
的形式,表示默认捕获方式(&
或 =
),同时显式指定某些变量的捕获方式。[&, x]
int x = 10, y = 20;
auto lambda = [&, x]() {
y = 30; // 修改 y(默认按引用捕获)
// x 是只读的(显式按值捕获)
return x + y;
};
lambda();
std::cout << x << " " << y; // 输出: 10 30
[=, &x]
int x = 10, y = 20;
auto lambda = [=, &x]() {
x = 30; // 修改 x(显式按引用捕获)
// y 是只读的(默认按值捕获)
return x + y;
};
lambda();
std::cout << x << " " << y; // 输出: 30 20
this
指针this
指针,以访问类的成员变量和成员函数。class MyClass {
public:
int x = 10;
void print() {
auto lambda = [this]() {
std::cout << x; // 访问成员变量 x
};
lambda();
}
};
MyClass obj;
obj.print(); // 输出: 10
int x = 10;
auto lambda = [y = x + 1]() {
return y;
};
std::cout << lambda(); // 输出: 11
mutable
关键字)mutable
关键字。int x = 10;
auto lambda = [x]() mutable {
x = 20; // 修改按值捕获的变量
return x;
};
lambda();
std::cout << x; // 输出: 10(外部变量未被修改)
C++ lambda 表达式的捕获列表形式非常灵活,主要包括:
[]
[&]
[=]
[x, &y]
[&, x]
或 [=, &x]
this
指针mutable
)根据具体需求选择合适的捕获方式,可以更好地控制 lambda 表达式的行为。如果你有其他问题,欢迎继续讨论!