Lambda表达式
用于快速定义一个匿名函数对象(闭包)
语法:
1
2
3
[捕获变量](参数列表) 可选限定符->返回类型{
代码
}原理
实际上是函数对象的一种快速定义方式
1
2
3
4
5
6
7
8
9
int x = 7;
float y = 3.0;
struct {
int _x;
float y;
float operator()(int a,int b) const{
return _x *_ y+a*b;
}
}p{x,y};变量捕获
按值捕获
lambda中的成员变量是外部变量的拷贝
外部更改不会改变内部的变量
此时lambda对应的函数调用运算符默认是const函数,函数内部不能修改按值捕获的变量,也不能调用非常量函数(或者可以在lambda函数后加上mutable限制符)
按引用捕获
在中括号中变量前添加引用运算符
外部更改会改变内部的变量
若所引用的变量已经失效,则会报错或访问无效数据
默认捕获方式
[=]:默认按值捕获
[&]:默认按引用捕获
[this]/[*this]:在类中按引用/按值捕获,可以访问类成员
此时也可以添加特例,添加显式捕获的变量
但默认捕获和显式捕获不能相同
其中[=], [&], [&, this], [=, *this], [=, this]这几种捕获方式,this都是按引用捕获的
变量使用
除了可以使用捕获变量,还可以使用自定义变量,外层中的静态变量与全局变量
泛型lambda
在参数类型中使用auto即可实现泛型lambda,相当于套了类模板