C++:thread的lambda表达式

Lambda表达式在c++11之后引入。

完整形式

[ captures ] ( params ) specs requires (optional) { body }
captures :已存在局部变量的捕获列表
param:函数输入参数列表,除捕获的变量外,调用时可以传入参数
specs :函数选项,对函数进行修饰,可以用mutable,constexpr,static等,可以不写
requires (optional):暂时不明白,不过这个位置可以放函数返回类型限制。
body:函数体

具体参考:
C++多线程:Lambda表达式

外部参数捕获

全局变量可以直接使用
局部变量需要捕获
  1. [] () {}:默认情况,没有捕获外部变量,只能使用全局变量
  2. [=] () {}:值拷贝捕获,将所有局部变量的值进行拷贝,此时可是使用局部变量和全局变量。但局部变量是只拷贝不能修改。定义一次后任何时候都可以再反复调用,但是该函数中捕获的局部变量不会因为外部的变量值改变而改变。
  3. [&] () {}:引用捕获,捕获所有局部变量的引用。捕获的这些局部变量具体的值在函数实际运行时才确定
  4. [=,&j,&k]:默认拷贝方式,对特定变量使用引用捕获,其他的变量均为值拷贝捕获
  5. [&,j,k]:默认引用方式,对特定变量使用值拷贝捕获,其他的变量均为引用捕获
  6. [j, &k]:不考虑默认方式,只针对个别想要的值进行捕获,未列出来的能使用
  7. [this]:定义在类内部的lambda不能直接访问类成员变量和成员函数,如果要访问,需要对this指针进行捕获

使用值拷贝捕获是最安全的一种方式,使用引用捕获需要注意在函数运行期间需要保证捕获的局部变量一直存在

参数输入

capture是用于捕获局部变量的,但是只能捕获函数定义的时候就存在的变量。当我们需要在函数调用时传入新的参数给lambda表达式时就需要使用参数列表进行输入,即param

  1. [=](int a){}:等号是用来捕获局部变量的,int a 就是我们定义调用这个lambda需要传递的参数,这个和不同函数一样
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值