Почему лямбда захватывает только автоматические переменные хранения?

Я только начал изучать лямбда-функции в C ++, и я не понимаю, почему лямбда-функции позволяют захватывать только автоматические переменные хранения? Например:

int x;
int main() {
    [&x](int n){x = n;}; // 'x' cannot be captured...
    return 0;
}

С другой стороны, статические переменные вообще не нуждаются в захвате

static int s = 0;
[](int n){s = n;};

Итак, почему первый пример не разрешен, а второй работает?

12 голосов | спросил Tracer 29 J0000006Europe/Moscow 2014, 13:53:49

3 ответа


0

Вам нужно изменить сферу. Посмотрите на это:

int x = 4;

int main()
{
    cout << "::x = " << ::x << endl;

    [&](int a){ ::x = a; }(2);

    cout << "::x = " << ::x << endl;

    return 0;
}

Вывод:

::x = 4
::x = 2
ответил Dakorn 29 J0000006Europe/Moscow 2014, 14:21:05
0

Вам нужно вернуться и спросить себя: Почему лямбда-выражения вообще фиксируют переменные?

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

Вот почему лямбды могут перехватывать локальные переменные (копировать их значения во время создания лямбды). (Они также могут быть получены по ссылке, в качестве альтернативы по копии.)

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

ответил newacct 29 J0000006Europe/Moscow 2014, 23:25:01
0

Я согласен с комментарием StoryTeller. Как это. C ++ автоматически захватывает глобальную переменную.

int x = 4;

int main()
{
    cout << "::x = " << ::x << endl;

    [](int a){ ::x = a; }(2);

    cout << "::x = " << ::x << endl;

    return 0;
}

Вывод:

::x = 4
::x = 2
ответил wudijimao 20 Jpm1000000pmWed, 20 Jan 2016 14:11:58 +030016 2016, 14:11:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132