Он связан во время создания. Рассмотрим:
#include <functional>
#include <iostream>
std::function<int(int)> foo;
void sub()
{
int a = 42;
foo = [a](int x) -> int { return x + a; };
}
int main()
{
sub();
int abc = 54;
abc = foo(abc); // Note a no longer exists here... but it was captured by
// value, so the caller shouldn't have to care here...
std::cout << abc; //96
}
Здесь нет функции a
, когда функция вызывается - компилятор не сможет вернуться и обновить его. Если вы передадите a
по ссылке, то у вас есть неопределенное поведение. Но если вы пройдете по значению, любой разумный программист ожидает, что это сработает.