Что означает захват слова в контексте лямбда?

Может кто-нибудь прокомментировать это? Является ли лямбда захватывающим внешние переменные, или внешний мир захватывает ценности, производимые лямбдами? Что это значит для захвата определенной переменной?

Ответы

Ответ 1

Лямбда захватывает внешнюю переменную.

Лямбда является синтаксисом для создания класса. Захват переменной означает, что переменная передается конструктору для этого класса.

Лямбда может указать, передавалась ли она по ссылке или по значению. Например:

[&] { x += 1; }       // capture by reference
[=] { return x + 1; } // capture by value

Первый производит класс примерно так:

class foo { 
    int &x;
public:
    foo(int &x) : x(x) {}
    void operator()() const { x += 1; }
};

Второй производит класс примерно так:

class bar {
    int x;
public:
    bar(int x) : x(x) {}
    int operator()() const { return x + 1; }
};

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

Ответ 2

Джерри Коффин дал вам подробный ответ, я согласен с тем, что лямбда является синтаксисом для создания класса. Существует множество опций о том, как переносятся переменные и как. Список вариантов:

[]  Capture nothing (or, a scorched earth strategy?)
[&] Capture any referenced variable by reference
[=] Capture any referenced variable by making a copy
[=, &foo]   Capture any referenced variable by making a copy, but capture variable foo by reference
[bar]   Capture bar by making a copy; don't copy anything else
[this]  Capture the this pointer of the enclosing class