Как работают некоторые gradle-зависимости без версии?

Что такое лямбда-функция?

Концепция лямбда-функции C ++ основана на исчислении лямбда и функциональном программировании. Лямбда - это неназванная функция, которая полезна (в реальном программировании, а не в теории) для коротких фрагментов кода, которые невозможно повторно использовать и не стоит именовать.

В C ++ функция лямбда определяется следующим образом

[]() { } // barebone lambda

или во всей его славе

[]() mutable -> T { } // T is the return type, still lacking throw()

[] - это список захвата, () список аргументов и {} тело функции.

Список захвата

Список захвата определяет, что из-за лямбда должно быть доступно внутри тела функции и как. Это может быть либо:

  1. значение: [x]
  2. ссылка [& amp; x]
  3. любая переменная, находящаяся в настоящее время в области по ссылке [ & amp;]
  4. то же, что и 3, но по значению [=]

Вы можете смешать любое из вышеперечисленного в списке с разделителями-запятыми [x, &y].

Список аргументов

Список аргументов тот же, что и в любой другой функции C ++.

Тело функции

Код, который будет выполняться, когда на самом деле вызывается лямбда.

Вывод типа возврата

Если лямбда имеет только один оператор return, возвращаемый тип может быть опущен и имеет неявный тип decltype(return_statement).

Mutable

Если лямбда отмечена как изменяемая (например, []() mutable { }), она разрешено изменять значения, которые были записаны по значению.

Случаи использования

Библиотека, определенная стандартом ISO, в значительной степени зависит от лямбда и повышает удобство использования нескольких баров, так как теперь пользователи

C ++ 14

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

Generic Lambdas

Теперь Lambdas может быть общим (auto был бы эквивалентен T здесь, если T был аргументом шаблона типа где-то в окружающей области):

auto lambda = [](auto x, auto y) {return x + y;};

Улучшенная вычитание возвращаемого типа

C ++ 14 позволяет выводить возвращаемые типы для каждой функции и не ограничивает ее функциями return expression;. Это также распространяется на лямбда.

16
задан Opal 16 January 2017 в 13:09
поделиться