C++ 包含lambda的结构,通过引用修改值

C++ 包含lambda的结构,通过引用修改值,c++,lambda,C++,Lambda,下面是一个简单的程序,它使用value\u控件struct来存储修改整数变量的lambda: #include <iostream> #include <functional> struct value_control { std::function<void(void)> increase; std::function<void(void)> decrease; }; int main() { auto a =

下面是一个简单的程序,它使用
value\u控件
struct来存储修改整数变量的lambda:

#include <iostream>
#include <functional>

struct value_control
{
    std::function<void(void)> increase;
    std::function<void(void)> decrease;
};

int main()
{   
    auto a = 123;

    value_control a_control{ [&]() { a += 1; }, [&]() { a -= 1; } };

    a_control.decrease(); std::cout << a << std::endl;

    a_control.increase(); std::cout << a << std::endl;
}
下面是一个版本,它将
值控制
创建抽象为
生成数值控制

#include <iostream>
#include <functional>

struct value_control
{
    std::function<void(void)> increase;
    std::function<void(void)> decrease;
};

int main()
{   
    auto make_numeric_control = [](int& var, int change)
    {
        return value_control
        {
            [&]() { var += change; },
            [&]() { var -= change; }
        };
    };

    auto a = 123;

    auto a_control = make_numeric_control(a, 1);

    a_control.decrease(); std::cout << a << std::endl;

    a_control.increase(); std::cout << a << std::endl;
}

关于如何编写
使数值控件
与第一个版本一样工作的任何建议?

这是因为您通过引用捕获
更改
,以及由于捕获说明符
[&]
而捕获的
变量
<当
make\u numeric\u control
退出时,code>change将被销毁,因此在闭包内它将是一个悬空引用

您可以通过按引用捕获
var
和按值捕获
change
来解决此问题:

    return value_control
    {
        [&var, change]() { var += change; },
        [&var, change]() { var -= change; }
    };

[&,change](){var+=change;}
@PiotrSkotnicki-Perfect。。。谢谢你,彼得!请注意,您的结构不包含lambas。
-19620773
178
    return value_control
    {
        [&var, change]() { var += change; },
        [&var, change]() { var -= change; }
    };