Почему нельзя захватить глобальную переменную?
int x = 42;
auto f = [x]() { return x; };
int main(){ f(); }
error: 'x' cannot be captured because it does not have automatic storage duration
Почему нельзя захватывать глобальные переменные?
Ответы (2 шт):
Ну, она везде (в том числе и в лямбде) доступна и так, но если ну очень хочется, то...
int x = 42;
auto f = [x=x]() { return x; };
int main()
{
cout << f();
}
?
Локальные переменные захватывают, потому что у них нет постоянного места в памяти (адрес может быть разный при каждом вызове функции, которая их создает), их может быть больше одной штуки (при рекурсии), они могут неожиданно исчезнуть (при выходе из функции), и т. п.
А для глобальных переменных захват не нужен, поэтому и не разрешается. К ним можно обращаться без захвата. Не нужен, потому что они всегда существуют ровно в одном экземпляре, всегда в одном и том же месте в памяти.
Если очень хочется иметь в лямбде копию переменной, то начиная с C++14 можно написать [x = x]{return x;}.