Ответ 1
Формально говоря, способность доступа к окружающему контексту является ключевым различием между функцией (которая не может) и закрытием (которая может). В зависимости от языков этот захват среды может происходить посредством копирования или ссылки.
В С++ 11 (и далее) lambdas являются закрытиями и, как обычно, с С++, мы имеем мелкозернистый способ определения того, как выполняется захват:
- копией: неявно
[=]() { return i; }
или явно[i]() { return i; }
- по ссылке: неявно
[&]() { return i; }
или явно[&i]() { return i; }
и С++ 14 даже вводит обобщенные лямбда-захваты, поэтому вы можете захватить:
- путем перемещения: существующая переменная
[i = std::move(i)]() { return i; }
- или создать новую переменную
[i = 1]() { return i; }
Квадратные скобки ограничивают список захвата.