在 C++11 中,Lambda 表达式引入了捕获列表(capture list),用于在 Lambda 函数中捕获外部变量。其中,[&]
和 [=]
是两种常见的捕获方式,它们分别表示以引用方式捕获和以值传递方式捕获外部变量。以下是它们的详细用法:
[&]:引用捕获
int a = 10;
auto lambda = [&]() {
// 在 Lambda 中可以访问外部作用域的变量 a,并且修改其值
a++;
qDebug() << "a inside lambda:" << a;
};
- 在捕获列表
[&]
中,&
表示以引用方式捕获所有的外部变量。 - Lambda 表达式中对外部变量的修改会影响到外部变量的值。
[=]:值传递捕获
int b = 20;
auto lambda = [=]() {
// 在 Lambda 中可以访问外部作用域的变量 b,但不能修改其值
qDebug() << "b inside lambda:" << b;
};
- 在捕获列表
[=]
中,=
表示以值传递方式捕获所有的外部变量。 - Lambda 表达式中对外部变量的修改不会影响到外部变量的值。
示例
#include <iostream>
int main() {
int x = 5;
int y = 10;
auto lambda_by_ref = [&]() {
x++;
y++;
};
auto lambda_by_val = [=]() {
// x++; // 这一行会导致编译错误,因为 x 是以值传递方式捕获的,不能修改其值
// y++; // 这一行会导致编译错误,因为 y 是以值传递方式捕获的,不能修改其值
std::cout << "x: " << x << ", y: " << y << std::endl;
};
lambda_by_ref(); // 修改了 x 和 y 的值
lambda_by_val(); // 打印 x 和 y 的值,但不能修改其值
return 0;
}
在这个示例中,lambda_by_ref
使用了引用捕获,可以修改外部变量 x
和 y
的值;而 lambda_by_val
使用了值传递捕获,不能修改外部变量的值,只能读取。