lambda表达式
形:
[capture list] (parameter list)->return type{function body}
capture list (捕获列表):是一个lambda所在函数中定义的局部变量列表(通常为空,表示不使用所在函数的任何局部变量)
parameter list return type f unction body与普通函数一样;
其中,必须包括捕获列表,函数体
auto f=[] {return 42;};
调用方式:调用运算符 cout<<f()<<endl;
传递参数:
注意:lambda不能有默认参数,即一个lambda调用的实参数目与形参数目相等
//按长度排序,长度相同的按字典序
stable_sort(words.begin(),word.end(),[](const string &a,const string &b){return a.size()<b.size();});
捕获:
值捕获:使用前提变量可拷贝,在lambda创建时拷贝,不是调用时
void fcn1()
{
size_t v1=42;
auto f=[v1]{return v1;};
v1=0;
auto j=f();//j为42
}
引用捕获:
注意:确保被引用对象在lambda执行时存在;有时引用捕获时是必须的,捕获不能拷贝的对象,如ostream对象
void fcn2()
{
size_t v1=42;
auto f=[&v1]{return v1;};
v1=0;
auto j=f();//j为0
}
隐式捕获
&捕获引用方式 =值捕获方式
混合捕获方式:捕获列表的第一个元素必须为一个&或=,显式捕获的变量必须使用与隐式捕获不同的方式,即,隐引,则显值;
[&,c](const string &s){os<<s<<c;} [=,&os](const string &s){os<<s<<c;}
lambda返回类型
默认情况下,如果一个lambda体包含return 之外的任何语句,则编译器假定lambda返回void
[](int i){return i<0?-i:i;}lambda体为单一return语句,返回无须指定返回类型,可推断
[](int i){if(i<0)return -i;else return i;}错误;不能判断lambda的返回类型
[](int i)->int{if(i<0)return -i;else return i;}指定返回类型