C++ 11.2 Lambda表达式

参数与函数体与返回类型 

 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只能在编译期调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值