c++ - struct containing lambdas which modify values via reference -


here's simple program uses value_control struct store lambdas modify integer variable:

#include <iostream> #include <functional>  struct value_control {     std::function<void(void)> increase;     std::function<void(void)> decrease; };  int main() {        auto = 123;      value_control a_control{ [&]() { += 1; }, [&]() { -= 1; } };      a_control.decrease(); std::cout << << std::endl;      a_control.increase(); std::cout << << std::endl; } 

output:

122 123 

here's version abstracts out value_control creation 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 = 123;      auto a_control = make_numeric_control(a, 1);      a_control.decrease(); std::cout << << std::endl;      a_control.increase(); std::cout << << std::endl; } 

this version of program not behave first:

-19620773 178 

any suggestions how write make_numeric_control such second version works first version?

this because capture change reference var due [&] capture specifier. change destructed when make_numeric_control exits, inside closure dangling reference.

you can fix capturing var reference , change value:

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

Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -