版权声明:所有的博客都是个人笔记,交流可以留言或者加QQ:2630492017 https://blog.csdn.net/qq_35976351/article/details/85314020
lambda
函数的执行是在真正调用的时候,这和普通函数没有太大区别,只是lambda
没有实际的名称而已。lambda
的另一个特点是可以捕获周围的变量,捕获的方式分为值和引用。
捕获的是立刻发生的,而不是等到函数调用的时候,只要声明一个lambda而且声明了捕获,那么捕获的动作就会发生。但是注意,如果是传递引用,那么得到的结果是不确定的,因为引用只是原来变量的一个别名,这也是非常危险的行为。
给出代码实例,多线程处理,先声明两个lambda,不立刻调用,但是捕获却立刻发生了。
#include <iostream>
#include <thread>
int main() {
int a = 0;
auto fun1 = [a]() { // 函数未调用,但是发生了捕获
std::cout << "sub thread, res = " << a << std::endl;
};
auto fun2 = [&a]() { // 函数未调用,但是发生了捕获
std::cout << "sub thread value, res = " << a << std::endl;
};
++a;
std::cout << "main thread reference, res = " << a << std::endl;
// 以下才是真正执行lambda
std::thread t1(fun1);
std::thread t2(fun2);
t1.join();
t2.join();
return 0;
}
输出:
main thread reference, res = 1
sub thread, res = 0
sub thread value, res = 1
使用lamda的好处是可以保留某个时刻的状态,这是其他方式无法做到的。
另一个更加