c/c++语言开发共享可变lambda, lambda使用mutable关键字

关于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 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/601518.html

(0)
上一篇 2021年5月9日
下一篇 2021年5月9日

精彩推荐