繁体   English   中英

lambda函数c ++通过值捕获重置其值,为什么?

[英]lambda function c++ capture by value reset its values, why?

有人可以解释一下为什么localVar增加1后会重置为10? 看起来lambdas在执行它们之前会复制堆栈上的capture-by-value。

void lambdaTest()
{
    int localVar = 10;

    // Access all local variables by reference
    auto byRef = [&] ()
    {
        cout << "localVar = " << ++localVar << endl;
    };

    // Access all local variables by value
    auto byValue = [=] () mutable 
    {
        cout << "localVar = " << localVar << endl;
    };


    byRef();        // localVar = 11
    byValue();      // localVar = 10, why?
}

是的,这正是他们所做的。

Lambdas在内部是为您设置operator()结构。 当您要求lambda按值捕获时,struct会存储作为struct成员引用的任何局部变量的副本 因此,您所看到的不是localVar被重置,您正在看到lambda的 localVar 副本

这是一个说明此行为的示例:

#include <iostream>
#include <assert.h>

int main()
{
    int localVar = 10;
    auto byRef = [&]() {
        std::cout << "byRef = " << ++localVar << '\n';
    };
    auto byValue = [=]() mutable {
        // `mutable` lets us make changes to the *copy* of `localVar`
        std::cout << "byVal = " << localVar++ << '\n';
    };
    byRef();   // byRef = 11  -> actual localVar is now 11
    byRef();   // byRef = 12  -> actual localVar is now 12
    byRef();   // byRef = 13  -> actual localVar is now 13
    byValue(); // byVal = 10  -> copied localVar is now 11
    byValue(); // byVal = 11  -> copied localVar is now 12
    assert(localVar == 13);
}

演示

只需添加另一个输出。

void lambdaTest()
{
    int localVar = 10;

    // Access all local variables by reference
    auto byRef = [&] ()
    {
        cout << "localVar = " << ++localVar << endl;
    };

    // Access all local variables by value
    auto byValue = [=] () mutable
    {
        cout << "localVar = " << localVar << endl;
    };


    byRef();        // localVar = 11
    byValue();      // localVar = 10
    cout <<localVar << endl; // localVar = 11
}

当定义lambda时,c ++ 11按值捕获捕获值。因此,lambda没有更改外部值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM