Почему нельзя захватить глобальную переменную?

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 шт):

Автор решения: Harry

Ну, она везде (в том числе и в лямбде) доступна и так, но если ну очень хочется, то...

int x = 42;

auto f = [x=x]() { return x; };

int main()
{
    cout << f();
}

?

→ Ссылка
Автор решения: HolyBlackCat

Локальные переменные захватывают, потому что у них нет постоянного места в памяти (адрес может быть разный при каждом вызове функции, которая их создает), их может быть больше одной штуки (при рекурсии), они могут неожиданно исчезнуть (при выходе из функции), и т. п.

А для глобальных переменных захват не нужен, поэтому и не разрешается. К ним можно обращаться без захвата. Не нужен, потому что они всегда существуют ровно в одном экземпляре, всегда в одном и том же месте в памяти.

Если очень хочется иметь в лямбде копию переменной, то начиная с C++14 можно написать [x = x]{return x;}.

→ Ссылка