语法如下:
//直接调用 []{ cout<<"hello lambda1"<<endl; }(); //传递给对象 auto l=[]{ cout<<"hello lambda2"<<endl; }; l();
Lambda可以有参数
auto l2 = [](const string& s){ cout<<"s: "<<s<<endl; }; l2("hello lambda3");
Lambda 可以返回某物。但不需要指明返回类型。该类型会根据返回值被推导出来。
如果想指明一个返回类型,可使用新式C++语法。
int a = [] { return 42; }(); cout<<"a="<<a<<endl; double b = [] () -> double { return 43; }(); cout<<"b="<<b<<endl;
方括号内,可以指明一个capture用来处理外部作用域内,未被传递为实参的数据
[=]表示外部作用域的以by value的方式传递给lambda。Lambda内修改变量不会改动外部作用域的数据。
[&]表示外部作用域的以by reference的方式传递给lambda。Lambda内修改变量会改动外部作用域的数据。
int x=0,y=42; auto qqq=[x,&y]{ cout<<"x: "<<x<<endl; cout<<"y: "<<y<<endl; y++; }; x=y=77; qqq(); qqq(); cout<<"final y: "<<y<<endl;
以上的代码也可以用 [=, &y]取代 [x,&y]
mutable的作用:
int id=0; auto f1=[id]()mutable{ cout<<"id :"<<id<<endl; ++id; }; id=42; f1(); f1(); f1();
上述行为可视为:
class{ private: int id; public: void operator ()(){ cout<<"id :"<<id<<endl; ++id; } };
Lambda类型。
Lambda类型是个匿名function object。如果想根据该类型声明对象。可借助template或auto。如果实在需要写下该类型,可使用decltype()。或者使用std::function<> class template。
#include <iostream> #include <functional> std::function<int(int,int)> returnLambda(){ return [](int x,int y){ return x*y; }; } int main(){ auto lf=returnLambda(); cout<<"lf(5,7)="<<lf(5,7)<<endl; return 0; }