Лямбда фиксирует состояние в точке, в которой оно объявлено.Поэтому, когда у вас есть
auto state_0_stuff = [&](){
lots_of_calcs_that_reference_caller_data();
.
caller_data.some_func();
.
}
в глобальном пространстве, [&]
будет захватывать только то, что доступно в этом пространстве.Когда вы вызываете лямбду в функции, она будет использовать это захваченное состояние, а не текущее состояние функции.
Вам нужно будет либо объявить лямбда в функции, либо написать функцию / функтор, которыйВы передаете состояние в.Вы также можете сделать ее закрытой функцией-членом класса, чтобы у нее был доступ к состоянию класса, и вам нужно было бы только передать ему любое нужное локальное состояние функции.
Еще немного глубинычто происходит, когда вы объявляете лямбду:
Когда вы делаете
auto foo = [&](){ your code here };
Компиляция расширяет его до чего-то вроде (очень упрощенно):
struct some_compiler_generate_name
{
some_compiler_generate_name(list of captured variables) : initialize captured variables {}
operator () const { your code here }
private:
captured variables;
} foo(list of variables to capture);
Так что выМожно видеть, что мы создаем лямбда-объект прямо в точке объявления, и, поскольку это сделано, он инициализируется с любыми захваченными переменными, которые у него могут быть.Вы не можете перехватить переменные, потому что вы не можете снова вызвать их конструктор.