c++ 中lambda

C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。

lambda 表达式使用一对方括号作为开始的标识,类似于声明一个函数,只不过这个函数没有名字,也就是一个匿名函数

Lambda表达式完整的声明格式  

[capture list] (params list) mutable exception-> return type { function body } 

各个变量的含义

  1. capture list:捕获外部变量列表
  2. params list:形参列表
  3. mutable指示符:用来说用是否可以修改捕获的变量
  4. exception:异常设定
  5. return type:返回类型
  6. function body:函数体
[] // 不捕获任何外部变量
[=]// 以值的形式捕获所有外部变量,[=] 意味着,lambda 表达式以传值的形式捕获同范围内的变量。4.5
float f0 = 1.0; 
std::cout << [=](float f) { return f0 + std::abs(f); } (-3.5);
[&] // 以引用形式捕获所有外部变量,[&] 表明,lambda 表达式以传引用的方式捕获外部变量。
float f0 = 1.0; 
cout << [&](float f) { return f0 += std::abs(f); } (-3.5); 
cout << '\n' << f0 << '\n';
//输出值是 4.5 和 4.5。
[x, &y] // x 以传值形式捕获,y 以引用形式捕获
[=, &z]// z 以引用形式捕获,其余变量以传值形式捕获
[&, x]// x 以值的形式捕获,其余变量以引用形式捕获
[] {cout << "Hello from Lambda" << endl; } ();//注意:尾部的(),这对括号使得这个lambda表达式立即执行:
string result = [](const string & str) -> string { return "Hello from " + str; }("second Lambda");
cout << "Result: " << result << endl;
Result: Hello from second Lambda  
//如果我不想让 lambda 表达式自动推断类型,或者是 lambda 表达式的内容很复杂,不能自动推断怎么办?
//比如,std::abs(float)的返回值是 float,我想把它强制转型为 int。那么,此时,我们就必须显式指定 lambda 
//表达式返回值的类型
std::cout << [](float f) -> int { return std::abs(f); } (-3.5);

注意

  1. 对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针
  2. 对于[]的形式,如果要使用 this 指针,必须显式传入:[this]() { this->someFunc(); }();

参考:https://blog.csdn.net/qs9816/article/details/8888366

posted on 2018-03-31 20:32  tianzeng  阅读(1193)  评论(0编辑  收藏  举报

导航