Лямбда-выражения
Простая лямбда
Лямбда — функция, которую можно определить прямо в выражении:
auto square = [](int value) { return value * value;};std::cout << square(5) << '\n';[] — список захвата, параметры идут в (), тело — в {}. Компилятор обычно выводит возвращаемый тип автоматически.
Захват переменных
Лямбда может использовать локальные переменные из окружающего кода:
int limit = 10;auto isLarge = [limit](int value) { return value > limit;};[limit]— захватlimitпо значению.[&limit]— захват по ссылке.[=]— неявный захват используемых локальных переменных по значению.[&]— неявный захват по ссылке.
Не захватывай по ссылке переменную, которая исчезнет раньше, чем будет вызвана лямбда. Это особенно важно, если лямбда сохраняется или выполняется асинхронно.
Изменяемый захват
Лямбда с захватом по значению не может менять захваченную копию в обычном operator() const. Слово mutable разрешает изменять эту копию:
int count = 0;auto next = [count]() mutable { return ++count; };Исходный count при этом не меняется.
Использование с алгоритмами
std::vector<int> values{1, 2, 3, 4};std::sort(values.begin(), values.end(), [](int a, int b) { return a > b; });Предикат сортировки должен задавать корректный строгий слабый порядок. Не используй сравнение, которое противоречит самому себе или зависит от изменяющегося состояния.
Итог
Лямбды удобны для короткого поведения рядом с местом использования. Осознанно выбирай захват по значению или ссылке и следи за временем жизни захваченных объектов.
