①.概念
一个 lambda 通过将局部变量包含在其捕获列表中来指定将会使用这些变量,只能使用明确指明的变量;变量捕获方式可以传值捕获,也可以传引用捕获。
②.按值捕获变量
在捕获列表中指定变量名字,类似传值的参数,被捕获的变量值将在 lambda 创建时被拷贝。
③.按引用捕获变量
用 & 引用捕获,一个以引用方式捕获的变量,在 lambda 中被使用时,实际上使用的引用所绑定的对象。
④.多参数捕获
捕获列表中可以指定捕获多个参数,并且可以为每个参数指定捕获方式。
⑤.隐式按值捕获
使用 [=] 表示按值捕获 lambda 所在范围内所有可见的局部变量。
⑥.隐式按引用捕获
使用 [&] 表示按引用方式捕获 lambda 所在范围内所有可见的局部变量。
⑦.隐式混和捕获
使用 [=,prams] 表示除 xxx 按引用捕获外,其他所有参数按值捕获;使用 [&,prams] 表示除 xxx 按值捕获外,其他所有参数按引用捕获。
04PART指定返回类型如果一个 lambda 函数体包含了 return 之外的任何语句,则编译器假定返回类型为 void,此时我们必须指定返回值类型。
05PARTlambda 是函数对象定义一个 lambda ,编译器会生成一个与 lambda 对应的新的类类型。当向一个函数传递一个 lambda 时,同时定义了一个新类型和该类型的一个对象,生成的类包含所捕获变量对应的数据成员,数据成员在类创建时被初始化。
int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(vec), end(vec), [&sum](int x){sum += x;});
上述代码被编译器翻译后变为:
class lambda_b{private: int* m_pSum;public: lambda_b(int* pSum) { m_pSum = pSum; } void operator()(int x) const { *m_pSum += x; }};int sum = 0;std::vector<int> vec = { 1,2,3,4,5 };std::for_each(begin(arry), end(arry), lambda_b(&sum));
06PARTlambda 使用lambda 表达式实际为一个函数对象,可以把匿名函数保存在变量当有名函数来使用。
①.使用 auto 保存
int a = 1;int b = 2;//使用 auto 保存 lambda auto func = [a, &b](int c)mutable ->int { b = a + c; return a; };//做有名函数使用 cout << b << " "<< func(10) << endl;
②.函数指针保存
当 lambda 的捕获外部变量列表为空时,可使用普通函数指针来保存。
//使用函数指针保存 lambda int(*func1)(int) = [](int x) {return x; };//函数调用int a = func1(20);
③.使用 std::function 模板类型
#include std::function<float(int,float)> fun1 = [](int x, float y) { return x + y; };float a = fun1(12,1.2);//函数调用
函数对象C++ 可调用对象(一)
扫码关注持续获取最新文章c++学习 算法与数据结构