📅  最后修改于: 2023-12-03 15:02:34.102000             🧑  作者: Mango
Lambda表达式是C++11引入的一种匿名函数定义方式,它可以在需要函数对象的地方使用,例如在算法、STL容器、线程等多种场合。Lambda表达式除了可以定义函数体以外,还可以在调用时捕获一些变量。
Lambda捕获是Lambda表达式中引入外部变量的一种方式,比较常见的有值捕获和引用捕获。对于值捕获,捕获的变量可以被修改,同时Lambda表达式中的变量也会被修改。为了防止被修改,可以使用const关键字来声明捕获的变量为只读。
值捕获:[&
]或[=
]符号后跟要捕获的变量,使用const
关键字使变量只读。
int a = 1;
auto lambda = [a]() { /*只读访问a*/ };
auto lambda2 = [=]() { /*只读访问a*/ };
auto lambda3 = [&a]() { /*读写访问a*/ };
auto lambda4 = [&]() { /*读写访问a*/ };
引用捕获:[&
]符号后跟要捕获的变量,使用const
关键字使变量只读。
int a = 1;
auto lambda = [&a]() { /*读写访问a*/ };
auto lambda2 = [&]() { /*读写访问a*/ };
auto lambda3 = [&](const int b) { /*只读访问a和b*/ };
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5};
int sum = 5;
auto lambda = [=]() mutable {
for (const auto& i : v)
{
sum += i;
}
std::cout << "The sum is " << sum << std::endl;
v.push_back(sum);
};
lambda();
for (const auto& i : v)
{
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出:
The sum is 20
1 2 3 4 5 20
通过值捕获,Lambda表达式中可以读取变量sum和v,但不能修改它们。因为值捕获是按值传递的,所以在修改之前需要将变量声明为mutable
。
在Lambda表达式中使用值捕获和引用捕获,我们可以将变量进行读写操作和只读操作,通过const
关键字我们还可以声明变量只读,避免在Lambda表达式中被意外修改。