С помощью лямбда-выражения привязанные переменные захватываются во время объявления .
Этот пример будет очень ясен: https: // ideone. com / Ly38P
std::function dowork()
{
int answer = 42;
auto lambda = [answer] () { return answer; };
// can do what we want
answer = 666;
return lambda;
}
int main()
{
auto ll = dowork();
return ll(); // 42
}
Ясно, что захват должен происходить перед вызовом, так как захватываемые переменные даже не существуют (не в масштаб, ни в жизни) больше в более позднее время.