这是一个简单的程序,它使用value_control
结构来存储修改整数变量的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;
}
输出:
122
123
这是一个将value_control
创作抽象为make_numeric_control
的版本:
#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;
}
该程序的版本与第一版的行为不同:
-19620773
178
有关如何编写make_numeric_control
以使第二个版本像第一个版本一样工作的任何建议吗?
答案 0 :(得分:4)
这是因为您通过引用以及change
捕获var
归因于[&]
捕获说明符。当change
退出时,make_numeric_control
将被破坏,因此在封闭内部将是一个悬空参考。
您可以通过引用var
和值change
来获取此值:
return value_control
{
[&var, change]() { var += change; },
[&var, change]() { var -= change; }
};