Лямбда-выражения: захват, 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 — локальная установка не требуется.
Все уроки этого курса
- auto, decltype и вывод типов
- Range-based for, nullptr и enum class
- Лямбда-выражения: захват, mutable, обобщённость
- Структурированные привязки и if-init в C++17