Lambda 表达式可以捕获哪些类型的变量?有哪些捕获方式?

捕获列表‌

用于指定Lambda表达式可以访问的外层作用域中的变量。捕获方式有值捕获、引用捕获和混合捕获。

[ ] 不捕获任何变量

[&] 捕获外作用域中的所有变量

[=] 捕获外作用域中的所有变量,按照值捕获,拷贝过来的副本在函数体内是只读的

[=,&a] 按值捕获外作用域中的所有变量,并且按照引用捕获外部变量a

[bar] 按值捕获 bar 变量,不捕获其他变量

[this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。

int main(){
    int a=10, b=20;
    auto fl=[]{return a;}; 
    //错误,没有捕获外部变量,因此无法访问变量 a
    auto f2=[&]{return a++;};
    //正确,使用引用的方式捕获外部变量,可读写
    auto f3=[=]{return a;};
    //正确,使用值拷贝的方式捕获外部变量,可读
    auto f4=[=]{return a++;};
    //错误,使用值拷贝的方式捕获外部变量,可读不能写
    auto f5=[al{return a+b;};
    //错误,使用拷贝的方式捕获了外部变量 a,没有捕获外部变量 b,因此无法访问变量 b
    auto f6=[a,&b]{returna+(b++);}; 
    //正确,使用拷贝的方式捕获了外部变量 a,只读,使用引用的方式捕获外部变量 b,可读写
    autof7=[=,&b]{returna+(b++);};
    //正确,使用值拷贝的方式捕获所有外部变量以及 b 的引用,b 可读写,其他只读
    return 0;
}

返回值类型

        指定Lambda表达式的返回类型。一般情况下,不指定 lambda 表达式的返回值,编译器会根据 return 语句自动对到返回值类型,但是需要注意的是,lambda 表达式不能通过列表初始化自动推导出返回值类型。
 

// 可以自动推导出返回值类型
auto f=[](int i){
    return i
}
//不能推导出返回值类型
auto fl =[](){
    return{1,2};// 基于列表初始化推导返回值,错误
}
//正确显示声明了函数的返回值类型
auto f1=[]()-> vector<int>{
    return{1,2};//基于列表初始化推导返回值,错误
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值