前话
前几天发现忽略了lamba表达式一个重要的部分
Lambda
C++ 中的Lambda函数的一般表达方法为:
[捕获列表](参数列表) -> [返回类型] {函数体}
- 捕获列表是一个Lambda函数所在的函数中使用的变量列表;
- ->指向的是返回值,位于参数列表后
一个栗子
[](void)->void
{ std::cout<<"Hello,World" <<std::endl; }
等价于
void print(void)
{
std::cout<<"Hello,World"<<std::endl;
return ;
}
捕获列表
Lambda就是通过捕获列表来使用并修改所在函数的局部变量。捕获列表总共有以下几种方式
- []:空捕获,Lambda无法使用所在函数的变量
- [变量列表]:以值捕获方式捕获指定的变量,而其他变量则不能被捕获,无法在Lambda内部使用。
- [&变量列表]: 以引用捕获的方式捕获指定的变量,而其他变量则不能被捕获,无法在Lambda内部使用。
- [=, 变量列表]:变量列表中指定的以引用的方式捕获,而其他的则以值的方式捕获。
- [&, 变量列表]:变量列表中指定的以值的方式捕获,而其他的则以引用的方式捕获。
- [=]:以值捕获的方式捕获所在函数的变量,可以直接在Lambda函数体中使用所在函数的所有局部变量而无需在捕获列表中逐个声明。
- [&]:以引用捕获的方式捕获所在函数的变量,可以直接在Lambda函数体中使用所在函数的所有局部变量而无需在捕获列表中逐个声明。
其中引用捕获不能修改变量,需要使用关键字mutable关键字