When you use
return [&func2d, &inX]( double inY ){ return func2d(inX, inY); };
you write func2d and inX by reference, which become dangling links when funcYgivenX .
Change the function to capture by value.
std::function< std::function< double(double) >(std::function< double(double, double) >, double) > funcYgivenX = [](std::function< double(double, double) > func2d, double inX) { return [func2d, inX]( double inY ){ return func2d(inX, inY); }; };
When you use
return [func2d, inX]( double inY ){ return func2d(inX, inY); };
you write the func2d and inX by value, which remain valid even after the funcYgivenX function funcYgivenX .
This is why the second version works, and the first version leads to undefined behavior.
See working code: http://ideone.com/X1CRGC .
source share