0Pricing
C++ Academy · Урок

Лямбда-выражения: захват, mutable, обобщённость

Пишите лямбда-выражения с захватом, семантикой mutable и обобщёнными параметрами auto.

«Лямбда-выражения: захват, mutable, обобщённость» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Что такое лямбда

Лямбда — это встроенный анонимный функциональный объект. Используйте её там, где иначе пришлось бы написать небольшую именованную функцию или структуру с operator().

auto square = [](int x) { return x * x; };
std::cout << square(5);   // 25

Разбор синтаксиса

Лямбда состоит из четырёх частей:

  • [capture] — переменные из окружающей области видимости, которые нужно использовать
  • (parameters) — как список параметров функции
  • -> return_type — необязательная часть, тип часто выводится автоматически
  • { body }

Пустой захват

[] означает «ничего не захватывать». Лямбда обращается только к глобальным и статическим объектам.

auto add = [](int a, int b) { return a + b; };

Захват по значению

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

int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3);   // 15 (captured n was 5)

Захват по ссылке

Добавьте префикс &, чтобы захватывать по ссылке. Изменения внутри лямбды влияют на внешнюю переменную.

int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter;   // 3

Захваты по умолчанию: [=] и [&]

Захватывайте всё используемое по значению с помощью [=] или всё по ссылке с помощью [&]. Используйте это осторожно — по возможности указывайте захваты явно.

auto f = [=]() { return a + b; };   // copies a, b
auto g = [&]() { return a + b; };   // references a, b

Изменяемые лямбды

По умолчанию захваченные по значению переменные имеют тип const внутри лямбды. Добавьте mutable, чтобы разрешить их изменение, — изменения затронут только копию внутри лямбды.

int n = 5;
auto f = [n]() mutable {
    n += 1;       // OK because of mutable
    return n;
};
f(); f();        // returns 6, then 7
std::cout << n;  // still 5 in outer scope

Вывод возвращаемого типа

Компилятор выводит возвращаемый тип из тела функции. При необходимости укажите его явно.

auto half = [](int x) -> double { return x / 2.0; };

Обобщённые лямбды (C++14)

Используйте auto в списке параметров, чтобы получить обобщённую лямбду, работающую с любым типом.

auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42);          // int
print("hello");    // const char*
print(3.14);       // double

Лямбды как аргументы функций

Алгоритмы STL принимают лямбды в качестве предикатов и преобразований.

std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });

Лямбды — функциональные объекты

Внутри компилятор создаёт класс с operator(). Лямбды можно хранить в std::function или auto.

Быстрая проверка

Внутри лямбды [n](int x) { return x * n; } можно ли присвоить значение n, не добавляя лямбде mutable?

Итоги

Лямбды — это анонимные встроенные функциональные объекты. Используйте захват по значению или по ссылке, добавляйте mutable для изменения захваченных по значению переменных и применяйте параметры auto для обобщённых лямбд в C++14 и более новых версиях.

Часто задаваемые вопросы

Урок «Лямбда-выражения: захват, mutable, обобщённость» бесплатный?

Да — полный текст урока «Лямбда-выражения: захват, mutable, обобщённость» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Лямбда-выражения: захват, mutable, обобщённость»?

Пишите лямбда-выражения с захватом, семантикой mutable и обобщёнными параметрами auto. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Лямбда-выражения: захват, mutable, обобщённость»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. auto, decltype и вывод типов
  2. Range-based for, nullptr и enum class
  3. Лямбда-выражения: захват, mutable, обобщённость
  4. Структурированные привязки и if-init в C++17
← Назад к C++ Academy