参数与函数体与返回类型
Lambda最终目的:建立一个可调用对象
例:
int main()
{
auto x = [](int val){return val>3;};
//指定返回类型
//auto x = [](int val) -> float{return val>3;};
std::cout<<x(5)<<std::endl;
}
lambda的本质是生成一个类。。。
Lambda的返回类型指定 -> 见上面例子
捕获
捕获的意思是指把y的值在构造x的时候复制到x内部。
静态对象和全局对象不需要捕获
值捕获
引用捕获
混合捕获
没有显示捕获,且没有定义,直接采取值捕获
auto res = [=](int val){return val>z;};
//对于z自动值捕获
auto res = [&](int val){return val>z;};
//对于z自动引用捕获
auto res = [&,z](int val){return val>z;};
//默认引用捕获,对于z 值捕获
auto res = [=,&z](int val){return val>z;};
//默认值捕获,对于z 引用捕获
std::cout<< x(5)<<std::endl;
this 捕获
如果捕获对象不是静态对象,也不是局部变量,那么该怎么捕获呢?
初始化捕获
除了引用捕获和值捕获之后,可以引入更复杂的操作,比如下图采用移动构造。。。a再被使用后为空
用z去取代x+y,避免重复计算,提升系统性能。
*this捕获
避免dangling point的产生,所以使用*this 而不是 this。把this指向的内容复制到lambda表达式内部。但是,复制的过程消耗了更多的资源,
说明符
下列代码无法通过编译
lambda 函数默认不对捕获对象进行改变,
cannot assign to a variable captured by copy in an non-mutable lambda.
解决方案,需要添加mutable关键词
添加constexpr关键词时表示lambda可以在编译期被调用。
constexpr编译的函数既能在编译期,也能在运行期调用;consteval只能在编译期调用。