Возможно ли в синтаксисе С++ 11/14 написать лямбда-функцию, которая увидит родительские переменные?

в абстракции:

int i = 1;
auto go = [] () {
    return i;
};

Можно ли сделать что-то подобное в современном синтаксисе С++?

Ответы

Ответ 1

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

В С++ 11 (и далее) lambdas являются закрытиями и, как обычно, с С++, мы имеем мелкозернистый способ определения того, как выполняется захват:

  • копией: неявно [=]() { return i; } или явно [i]() { return i; }
  • по ссылке: неявно [&]() { return i; } или явно [&i]() { return i; }

и С++ 14 даже вводит обобщенные лямбда-захваты, поэтому вы можете захватить:

  • путем перемещения: существующая переменная [i = std::move(i)]() { return i; }
  • или создать новую переменную [i = 1]() { return i; }

Квадратные скобки ограничивают список захвата.

Ответ 2

Конечно, зависит от того, хотите ли вы захватить его по значению:

auto go = [i] () {
    return i;
};

Или по ссылке:

auto go = [&i] () {
    return i;
};

Ответ 3

Просто поместите его в раздел захвата:

auto go = [i] () {
   return i;
};