Добавлю пару примеров к сказанному
MiiNiPaa:
Вот такой код:
auto GetLambda() {
return []( const int &x ) { return x*x ; } ;
}
это синтаксический сахар для такого (все это можно было писать еще и до появления лямбд):
struct Lambda {
int operator()(const int &x) { return x * x; }
};
Lambda GetLambda() {
return Lambda();
}
Отличие в том, что явно класс не создается, но принцип тот же. Возможно, на этом примере вам непонятно, зачем вся эта заморочка с классом. Поэтому рассмотрим другой пример. Этот код
auto GetLambda(int y) {
return [y](const int &x) { return x*y; };
}
можно переписать так:
struct Lambda {
int y;
Lambda(int y) : y(y) { }
int operator()(const int &x) { return x*y; }
};
Lambda GetLambda(int y) {
return Lambda(y);
}
Как видите, захват значения локальной переменной и "сопровождение" им кода лямбды осуществляется с помощью оборачивания в класс. Если еще не знакомились с
замыканиями, самое время это сделать.