Концепция лямбда-функции C ++ основана на исчислении лямбда и функциональном программировании. Лямбда - это неназванная функция, которая полезна (в реальном программировании, а не в теории) для коротких фрагментов кода, которые невозможно повторно использовать и не стоит именовать.
В C ++ функция лямбда определяется следующим образом
[]() { } // barebone lambda
или во всей его славе
[]() mutable -> T { } // T is the return type, still lacking throw()
[]
- это список захвата, ()
список аргументов и {}
тело функции.
Список захвата определяет, что из-за лямбда должно быть доступно внутри тела функции и как. Это может быть либо:
Вы можете смешать любое из вышеперечисленного в списке с разделителями-запятыми [x, &y]
.
Список аргументов тот же, что и в любой другой функции C ++.
Код, который будет выполняться, когда на самом деле вызывается лямбда.
Если лямбда имеет только один оператор return, возвращаемый тип может быть опущен и имеет неявный тип decltype(return_statement)
.
Если лямбда отмечена как изменяемая (например, []() mutable { }
), она разрешено изменять значения, которые были записаны по значению.
Библиотека, определенная стандартом ISO, в значительной степени зависит от лямбда и повышает удобство использования нескольких баров, так как теперь пользователи
В C ++ 14 lambdas были расширены различными предложениями.
Элемент списка захвата теперь можно инициализировать с помощью =
. Это позволяет переименовывать переменные и захватывать, перемещаясь. Пример, взятый из стандарта:
int x = 4;
auto y = [&r = x, x = x+1]()->int {
r += 2;
return x+2;
}(); // Updates ::x to 6, and initializes y to 7.
и один из Википедии, показывающий, как захватить с помощью std::move
:
auto ptr = std::make_unique<int>(10); // See below for std::make_unique
auto lambda = [ptr = std::move(ptr)] {return *ptr;};
Теперь Lambdas может быть общим (auto
был бы эквивалентен T
здесь, если T
был аргументом шаблона типа где-то в окружающей области):
auto lambda = [](auto x, auto y) {return x + y;};
C ++ 14 позволяет выводить возвращаемые типы для каждой функции и не ограничивает ее функциями return expression;
. Это также распространяется на лямбда.