С точки зрения синтаксиса, лямбда-выражение имеет следующую структуру:
Где:
1 - Маска переменных
2 - Список параметров
3 - Изменение параметра, переданного по значению
4 - Спецификация исключения
5 - Возвращаемый тип
6 - Тело лямбда выражения
Маска переменных
Лямбда выражение может получать доступ практически к любым переменным, существующих в контексте её вызова, и использовать их внутри тела. Список параметров определяет способ получения параметров телом лямбда выражения. Доступ к переменным, перед которыми стоит амперсанд (&), осуществляется по ссылке, а перед которыми нет амперсанда, соответственно по значению. Пустая маска ([]) означает, что тело лямбда-выражения не имеет доступа к переменным, существующих в контексте вызова лямбды.
Термин "контекст вызова лямбды" означает то место, где происходит вызов лямбды. В данном месте существуют какие-то переменные, принадлежащие основному коду, и набор этих переменных так же, для краткости, называют контекстом.
Стандартная маска определяет, получаем ли мы доступ к переменной по ссылке или же по значению. Устанавливая [&], все значения будут получены по ссылке. Используя же [=], переменные будут получены по значению. Например, если тело лямбда-выражения получает доступ к внешней переменной “total” по ссылке и переменной “factor” по значению, маска должна быть записана следующим образом:
int main() {
int total = 0;
int factor = 2;
// Лямбда-функция, которая получает доступ
// к внешней переменной "total" по ссылке,
// а к переменной "factor" по значению
auto lambda = [&total, factor](int value) {
total += value * factor;
return total;
};
std::cout << "Result: " << lambda(5) << std::endl; // Выводит результат 10
return 0;
}
Также, вы можете использовать лямбда-выражение внутри метода класса. Передавая указатель “this”, вы можете получить доступ к методам и членам данного класса.
Список параметров
Список параметров лямбда-выражения (который пишется в круглых скобках), содержит список параметров для функции, у которых существуют следующим ограничения:
1) Список параметров не может содержать значения по умолчанию
2) Не может содержать неименованные параметры
3) Ограниченное число параметров
Также лямбда-выражение может принимать в качестве параметра другое лямбда-выражение. С другой стороны, список параметров является опциональным элементов, и можно писать выражение, не включая его.
Изменение параметра переданного по значению
Спецификация позволяет разрешить телу лямбда-выражения изменять переменные, полученные по значению.
Спецификация исключений
Лямбда-выражения могут включать в себя спецификацию исключения, которая позволяет телу не создавать исключения (т. е. чтобы тело лямбда-выражения не генерировало исключений?). Надо разобраться.
Возвращаемый тип
Спецификация определяет возвращаемый тип лямбда-выражения. Вы можете не использовать данную конструкцию, если тело выражения имеет только одну инструкцию “return” или не возвращает значения вообще. Если тело содержит только одну “return”-инструкцию, компилятор установит возвращаемый тип лямбда выражения идентичный типу “return”-инструкции.
Тело лямбда выражения
На тело выражения накладываются идентичные ограничения, как на блок кода или метод.