Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Лямбда-выражения

Страница 35 из 43 · 2026-10-25 · 1 мин чтения

Лямбда-выражения

Простая лямбда

Лямбда — функция, которую можно определить прямо в выражении:

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; });

Предикат сортировки должен задавать корректный строгий слабый порядок. Не используй сравнение, которое противоречит самому себе или зависит от изменяющегося состояния.

Итог

Лямбды удобны для короткого поведения рядом с местом использования. Осознанно выбирай захват по значению или ссылке и следи за временем жизни захваченных объектов.