Skip to the content.

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


Лямбда-выражение (лямбда-функция, анонимная функция) - функция без имени

Синтаксис:

[захват контекста](параметры) { реализация, тело };

Возвращаемый тип по умолчанию определяется по return лямбда-функции, однако его можно указать явно:

[]()->int {};

Пример (передача анонимной функции в функцию):

void DoWork(std::function<void(int)> func)
{
    func(5);
}

// === 1 ===
std::function <void(int)> f;
f = [](int) { std::cout << "Anonymous\n"; };
DoWork(f);

// === 2 ===
DoWork([](int) { std::cout << "Anonymous\n"; } );

Какая же от этого польза? Бывают такие функции, которые будут использованы только в одном месте и нигде больше, однако они очень сильно захламляют пространтво имён своими названиями, соответственно в таких местах может быть выгоднее использовать лямбда-функции.

Захват переменных в контекст

Контекст лямбда-функции:

int a = 0;

[]()
{
  // все это пространство имён изолировано
  // от всего что вне этого пространства.
  // Таким образом мы не можем работать с
  // переменными вне контекста функции
  a = 5; // нельзя
};

Что бы работать с переменными, которые находятся вне контекста анонимной функции их нужно захватить:

Начиная с С++14 на лямбда-функции можно ссылаться используя auto:

auto f = [&p](int a) { p = 5; };
f(5);