20210830补充
可以使用方式在C++中使用匿名函数
void func(){ auto f = [](int x, int y){return x > y ? x : y;}; cout << f(1,2) << endl; }
Lambda表达式实际上提供一个匿名函数的特性。
而匿名函数则是在需要一个函数,又不想去费力命名一个函数的情况下去使用的。
[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
// 函数体
}
略去一般函数名,返回值用一个->形式进行。
所谓捕捉列表,其实可以理解为参数的一种类型,lambda表达式内部函数体在默认情况下是不能够
使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。
根据传递的行为,捕获列表也可以分为以下几种:
1)值捕获
与参数传值类似,捕获的前提是变量可以拷贝,不同之处在于,被捕获的变量在lambda表达式被创建时拷贝
,而非调用时才拷贝
void learn_lambda_func_1() { int value_1 = 1; auto copy_value_1 = [value_1] { return value_1; }; value_1 = 100; auto stored_value_1 = copy_value_1(); // 这时, stored_value_1 == 1, 而 value_1 == 100. // 因为 copy_value_1 在创建时就保存了一份 value_1 的拷贝 }
2)引用捕获
与引用传参类似,引用捕获保存的是引用,值会发生变化
void learn_lambda_func2(){ int value_2 = 1; auto copy_value_2 = [&value_2]{ return value_2; }; value_2 = 100; auto stored_value_2 = copy_value_2(); //此时,stored_value_2 == 100, value_1 == 100 //这是因为 copy_value_2 保存的是引用 }
3) 隐式捕获
在捕获列表中写一个&或= 向编译器声明采用引用捕获或者值捕获。
总结:捕获提供了lambda表达式对外部值进行使用的功能,捕获列表最常用的四种形式:
[] 空捕获列表
[name1,name2,.....]捕获一系列变量
[&]引用捕获,让编译器自行推导捕获列表
[=]值捕获,让编译器执行推导应用列表
---------------------------------------------------------------------------------------------------------------------------------
知识点是参考实验楼大佬的。不提供转载和分享。
来自《100行C++代码实现线程池》,有需要的童鞋就去开个年费吧。大约也就一天一块钱。
侵删,底下是传送门。
https://www.shiyanlou.com/courses/565/labs/1909/document