在 C++ 中,Lambda 函数可以通过不同的捕获列表来捕获函数外部的所有变量及其引用。捕获列表 [=]
捕获所有变量的值,而捕获列表 [&]
捕获所有变量的引用。这两种捕获方式之间存在一些区别:
-
捕获方式:
[=]
:值捕获方式,Lambda 函数内部的所有变量都会以传值的方式被捕获,即复制一份变量的值。[&]
:引用捕获方式,Lambda 函数内部的所有变量都会以引用的方式被捕获,即直接引用原始变量。
-
修改原始变量:
- 使用值捕获方式的 Lambda 函数,对捕获的变量的修改不会影响到原始变量的值。
- 使用引用捕获方式的 Lambda 函数,对捕获的变量的修改会直接影响到原始变量的值。
#include <iostream>
int main() {
int x = 10;
int y = 20;
// 值捕获方式
auto lambda1 = [=]() {
std::cout << "值捕获方式:x = " << x << ", y = " << y << std::endl;
};
// 引用捕获方式
auto lambda2 = [&]() {
std::cout << "引用捕获方式:x = " << x << ", y = " << y << std::endl;
// 修改捕获的变量值
// 这里修改的是原始变量的值,会直接影响原始变量的值
x = 100;
y = 200;
};
// 调用 Lambda 函数
lambda1();
lambda2();
// 输出修改后的变量值
std::cout << "修改后的变量值:x = " << x << ", y = " << y << std::endl;
return 0;
}