首页 > 解决方案 > 更改 c++ lambda 中捕获的变量的值

问题描述

我正在尝试通过引用将捕获的变量增加到 lambda 函数,但无法这样做。

通过按值捕获变量,然后使 lambda 可变,我可以增加该值。但是通过传递引用,增量没有得到应用。

此外,在按值捕获的情况下,如何在对 inc() 的调用中更新值。这类似于 JS 中的闭包吗?

**Capture By reference**

auto inc_count(int x){
    return [&x](){
        return x++;
    };
};

int main()
{
    auto inc = inc_count(4);
    cout<<inc()<<endl;    //32765
    cout<<inc()<<endl;    //32765
    cout<<inc()<<endl;    //32765
    cout<<inc()<<endl;    //32765

    return 0;
}


**Capture by value**

auto inc_count(int x){
    return [x]()mutable{
        return x++;
    };
};

int main()
{
    auto inc = inc_count(4);
    cout<<inc()<<endl;     //4
    cout<<inc()<<endl;     //5
    cout<<inc()<<endl;     //6
    cout<<inc()<<endl;     //7

    return 0;
}

实际输出:
32765
32765
32765
32765

预期输出:
4
5
6
7

标签: c++

解决方案


在第一个版本中,您正在捕获对函数返回后不存在的变量的引用。在函数返回并且您的代码具有未定义的行为后,您有一个悬空引用。

您可以使用以下内容通过引用进行捕获。

auto inc_count(int& x){
    return [&x](){
        return x++;
    };
};

但是,你不能使用int_count(4)in main。您必须使用一个变量,其引用可以在int_count.

int main()
{
    int number = 4;
    auto inc = inc_count(number);

    ...

    return 0;
}

推荐阅读