在C++11中,添加了新特性Lambda表达式,语法为
[captures] (params) specifiers exception -> ret {body};
- captures:捕获列表,代表捕获当前作用域0个或n个变量,之间用逗号间隔
- params:可选参数列表,使用方式和函数的参数列表相同,如果没有参数传递可省略
- specifiers:可选限定符(使用mutable,在且仅在函数体内修改值传递的变量)
- exception:可选异常说明符(使用noexcept指示表达式是否抛出异常)
- ret:表达式的返回值,如果没有返回值可以和“->”一同省略
- body:函数体
在捕获列表的使用当中,有一些特别的捕获方法
[this]:捕获this指针,可以使用this类型的成员变量和函数
[=]:捕获定义作用域中所有变量的值,包括this(值传递)
[&]:捕获定义作用域中所有变量的引用,包括this(地址传递)
下面是Lambda表达式的一些使用方法
int main() {
//1.[](){}进行lambda表达式的定义,最后一个()进行lambda的调用
[](){}();
[](){cout<<1234<<endl;}();
//2.参数列表的用法
[](int a){cout<<a<<endl;}(2);
//3.lambda表达式赋值给auto类型的变量
auto var=[](int a){cout<<"对lambda表达式进行赋值 "<<a<<endl;};
var(1);
//4.使用有返回值的lambda表达式
auto var1=[](int a,int b){
cout<<"有返回值的Lambda表达式"<<" ";
return a+b;
};
cout<<var1(1,1)<<endl;
//5.指定返回值的类型
auto var2=[]()->double{return 3;};
cout<<"指定返回值的lambda表达式 "<<var2()<<endl;
//6.通过值传递捕获变量(不修改捕获变量的值)
int x=2,y=2;
[x,y](){
cout<<"捕获作用域内的变量x+y "<<(x+y)<<endl;
}();
//7.通过地址传递捕获变量(修改变量的值)
[&x,y](){
x++;
cout<<"捕获作用域内的变量的引用x+y "<<(x+y)<<endl;
}();
//8.特殊捕获方式
[&](){
y=6;
cout<<"捕获作用域内的所有变量的引用 "<<y<<endl;
}();
[=](){
int temp=y+1;
cout<<"捕获作用域内所有变量的拷贝 "<<temp<<endl;
}();
[=,&y]
{
y=8;
cout<<"只有y传递引用,其他变量传递值 "<<y<<endl;
}();
//9.使用mutable暂时改变捕获变量的值
[x]()mutable{
x=9;
cout<<"使用关键字修改值传递的变量 "<<x<<" ";
}();
cout<<"只在lambda表达式内进行修改 x="<<x<<endl;
}