可变lambda, lambda使用mutable关键字
程序员文章站
2022-06-20 08:34:38
关于lambda的捕获和调用 C++ primer上对可变lambda举的例子如下: 因为原则上不能改变值捕获的v1,所以要在lambda里改变v1的话,需要加上mutable关键字。 我一开始不理解为什么j为43,而不是1。说明捕获是发生在 这句。而函数体内部语句调用,是在调用f()的时候执行。 ......
关于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
下一篇: 设计模式-结构型-享元模式
推荐阅读
-
python中lambda函数 list comprehension 和 zip函数使用指南
-
Android 中Lambda表达式的使用实例详解
-
AndroidStudio怎么使用lambda表达式?
-
MicroPython教程(Lambda函数使用)
-
Python3匿名函数lambda介绍与使用示例
-
在Python中使用lambda高效操作列表的教程
-
Effective Modern C++ 条款32 对于lambda,使用初始化捕获来把对象移动到闭包
-
Java8 Lambda表达式介绍和使用(附视频教程)
-
使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
-
在EF中使用Expression自动生成p=>new Entity(){X="",Y="",..}格式的Lambda表达式灵活实现按需更新