关于lambda的捕获和调用

C++ primer上对可变lambda举的例子如下:

    size_t v1=42;
auto f=[v1] () mutable{return ++v1; };
v1=0;
auto j=f(); //j 为 43

因为原则上不能改变值捕获的v1,所以要在lambda里改变v1的话,需要加上mutable关键字。

我一开始不理解为什么j为43,而不是1。说明捕获是发生在auto f=[v1] () mutable{return ++v1; };这句。而函数体内部语句调用,是在调用f()的时候执行。

调用完f(),再输出v1的值,此时由于之前lambda是值捕获,所以v1的值没有改变是0。

    size_t v1=42;
auto f=[&v1] () {return ++v1; };
v1=0;
auto j=f(); //j 为 1

如果是引用捕获,那就比较直观,因为v1是引用,所以当v1的值改变成0后,再调用f(),lambda函数体内部是0的值自加1。

归根究底,lambda加上mutable关键字后,值捕获v1,会在lambda内部生成个临时变量存储v1的值,从而每次调用进行的改变是可以累积的。如下:

    size_t v1=42;
auto f=[v1] () mutable{return ++v1; };
v1=0;
auto j=f(); //j 为 43
auto k=f(); //j 为 44

最新文章

  1. golang-web框架revel一个表单提交的总结
  2. VS2013单元测试 的安装、创建与执行
  3. android studio增量更新
  4. React-redux-webpack项目总结之用到的Es6基本语法
  5. 16_采用SharedPreferences保存用户偏好设置参数
  6. 5.cadence原理图上[原创]
  7. iOS开发——动画编程Swift篇&(五)CAKeyframeAnimation
  8. MFC逆向-消息响应函数的定位
  9. voa 2015 / 4 / 14
  10. 15:CSS3 3D
  11. 学c++需要先学c语言吗?
  12. java的移位运算详解(举例说明)
  13. 【Linq】常用语法汇总
  14. 【驱动】DM9000网卡驱动分析
  15. Tomcat连接参数的优化,主要是针对吞吐量做优化
  16. python's mutable & immutable
  17. 记开发个人图书收藏清单小程序开发(九)Web开发——新增图书信息
  18. 提示"libc.so.6: version `GLIBC_2.14' not found"
  19. Python并发编程-信号量
  20. 转:PHP获取浏览器类型及版本号

热门文章

  1. Codeforces Round 573 (Div.1) 题解
  2. [LeetCode] 663. Equal Tree Partition 划分等价树
  3. github git clone ssh协议 clone超慢解决方案,提高Github Clone速度
  4. Visual Studio 调试系列8 查找导致程序崩溃的 DLL(使用模块窗口)
  5. 企业应用向ASP.NET Core迁移
  6. 使用Django创建RESTful API
  7. 【转】用VMware 8安装Ubuntu 12.04详细过程(图解)
  8. MySQL使用现状分析与优化
  9. Git更改文件名大小写,提交失败问题解决
  10. 2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对