lambda的捕获和参数的使用

std::for_each()

[capture list] (params list) mutable exception-> return_type {function body}
含义:

  1. captrue list:捕获外部变量列表
  2. params list:形参列表
  3. mutable 指示符:用来说明是否可以修改捕获的变量
  4. exception:异常设定
  5. return_type:返回类型
  6. function body:函数体

此外,我们还可以省略其中的某些成分来声明“不完整”的Lambda表达式,常见的有以下几种:

序号格式
1[capture list] (params list) -> return type {function body}
2[capture list] (params list) {function body}
3

[capture list] {function body}

 

捕获与参数传入的区别,以一个结构体的函数对象例子

struct  amc{

int i_,  j_ ;

amc(int i, int j);

bool operator()(int a, int b){

i  *=  j;

std::cout<<a*b<<std::endl;

}

};

如果用lambda,

[i_, j_](const int a, const int b){

i_ *= j_;

return a*b;

}

捕获一般是对成员变量, 参数传入是对于函数的输入参数

C++11捕获外部变量总结

捕获形式说明
[]不捕获任何外部变量
[变量名, …]默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)
[this]以值的形式捕获this指针 类中所有成员变量
[=]以值的形式捕获所有外部变量
[&]以引用形式捕获所有外部变量
[=, &x]变量x以引用形式捕获,其余变量以传值形式捕获
[&, x]

变量x以值的形式捕获,其余变量以引用形式捕获

 对于值捕获[=]和引用捕获[&],

如果以传值方式捕获外部变量,则在Lambda表达式函数体中不能修改该外部变量的值。因为

值捕获创建了一个临时对象,拷贝了原变量的值,之后,这个临时变量与原来的变量再无任何瓜葛,lambda中操作的是这个临时变量。否则报错:

 error: increment of read-only variable ‘b’
   13 |    b++;
 

如果非要修改值捕获的变量,有方法吗?有!加上关键字mutable

但是!修改对原变量无任何影响!

b=1;

auto ef = [b]()mutable{
   
   b++;
   std::cout<<"bb: "<<b<<std::endl;
   
   };

但因为还是值传递,所以ef()会打印bb: 2  而实际外部的b还是1

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值