C++ 11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。
lambda 表达式使用一对方括号作为开始的标识,类似于声明一个函数,只不过这个函数没有名字,也就是一个匿名函数
Lambda表达式完整的声明格式
[capture list] (params list) mutable exception-> return type { function body }
各个变量的含义
- capture list:捕获外部变量列表
- params list:形参列表
- mutable指示符:用来说用是否可以修改捕获的变量
- exception:异常设定
- return type:返回类型
- 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 << ' ' << f0 << ' '; //输出值是 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);
注意
- 对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针
- 对于[]的形式,如果要使用 this 指针,必须显式传入:[this]() { this->someFunc(); }();
参考:https://blog.csdn.net/qs9816/article/details/8888366