lambda表达式的使用
本质上会被翻译成一个类
C++可以调用的对象
类
函数指针
仿函数
lambda表达式
基本组成部分
参数与函数体
返回类型
捕获:针对函数体中使用的局部自动对象进行捕获
值捕获,引用捕获和混合捕获
this 捕获
初始化捕获
*this捕获
说明符:
mutable/constexpr(C++17)/consteval(C++20)…
模板形参
[capture list] (parameter list) -> return type { function body };
举例如下:
auto x = [](int val)->float//指定返回值类型(当然也可以不用)
{return (val>3)&&(val<10);};
- []中括号用作捕获,
- 静态的全局变量,不需要捕获,直接使用即可
- 值捕获,值捕获对数据的处理,不会溢出到表达式的外部
int y = 10;
auto x = [y] (int val) mutable{
// ++y;
return val>y;
};
cout<<x(5)<<endl;
cout<<y<<endl;
使用引用捕获,声明引用,会对最外层的改变,输出的结果也会发生变化
int y = 10;
auto x = [&y] (int val) {
++y;
return val>y;
};
cout<<x(5)<<endl;
cout<<y<<endl;
混合捕获
int y = 10;
int z =3;
auto x = [&y,z] (int val) {
++y;
return y>z;
};
cout<<x(5)<<endl;
cout<<y<<endl;
使用等号,可以进行值捕获
使用&,表示使用的引用捕获
或者混合捕获也可以
那么如何在结构体中,使用this 捕获
struct Str{
auto fun(){
int val =3;
auto lam = [val,this](){
return val>x;
};
return lam();
}
int x;
};
int main(){
Str s;
s.fun();
}