[capture list](parameter list) -> return type {function body}
- capture list:捕获列表,是一个lambda所在函数中定义的局部变量列表
- parameter list、function body:与任何普通函数一样,表示参数列表和函数体。
- return type:lambda返回类型,但必须使用尾置(->)返回来指定返回类型。
### [] 和 {} 必须存在,其他可以省略
auto l1 = [] { cout << "Good" << endl; }; // 调用 l1(),打印“Good”
### 值捕获与引用捕获
注:
- 被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝。
- 如果我们采用引用方式捕获一个变量,就必须确保被引用的对象在lambda执行的时候是存在的。
int a = 0;
auto l = [a]() mutable {
cout << "a = " << a << endl;
++a; // 如果没有加mutable,++a不允许的
};
a = 19;
l(); // 输出 a = 0(因为是创建时拷贝)
l(); // 输出 a = 1
cout << "a = " << a << endl; // 输出 a = 19
// 传引用
int b = 0;
auto l2 = [&b](int param){
++b;
++param;
cout << "b = " << b << " param = " << param << endl;
};
b = 20;
l2(100); // 输出 b = 21, param = 101
l2(104); // 输出 b = 22, param = 105
cout << "b = " << b << endl; // 输出 b = 22
### 捕获列表
这里我不引用许多地方的隐式捕获和显示捕获的概念,理解起来很绕。
只要记住,&表示引用捕获,=是传值捕获。
然后单独以&和=开头的话,后面的变量采用的方式相反即可。