在 C++11 中,lambda 表达式可以通过捕获列表来捕获指定的变量。捕获列表是放在 lambda 表达式参数列表之前的一对方括号 []
中,用来指定 lambda 表达式捕获哪些变量。
捕获列表有以下几种形式:
[]
:不捕获任何变量。[&]
:以引用的方式捕获所有变量。[=]
:以值的方式捕获所有变量。[x, &y]
:以值的方式捕获变量x
,以引用的方式捕获变量y
。[&x, y]
:以引用的方式捕获变量x
,以值的方式捕获变量y
。
其中,&
表示以引用的方式捕获变量,=
表示以值的方式捕获变量。方括号中的变量名表示要捕获的变量,多个变量之间用逗号分隔。
例如,以下代码演示了如何在 lambda 表达式中捕获指定变量:
#include <iostream>
int main() {
int x = 1;
int y = 2;
auto f = [x, &y]() {
std::cout << "x = " << x << ", y = " << y << std::endl;
x++;
y++;
};
f(); // 输出 x = 1, y = 2
std::cout << "x = " << x << ", y = " << y << std::endl; // 输出 x = 1, y = 3
return 0;
}
在这个例子中,我们定义了一个 lambda 表达式 f
,通过捕获列表 [x, &y]
捕获了变量 x
和 y
。在 lambda 表达式中,我们输出了变量 x
和 y
的值,并对它们进行了修改。在 lambda 表达式执行完毕后,我们再次输出变量 x
和 y
的值,可以看到变量 x
的值没有改变,而变量 y
的值已经被修改了。
总结:
Lambda 表达式捕获变量,值方式与引用方式的不同:
1.值方式捕获变量,该变量可读可写;
2.引用方式捕获变量,该变量仅可读;