Зачем нужен шаблон лямбда, введенный в C ++ 20, когда в C ++ 14 уже есть универсальная лямбда? - PullRequest
0 голосов
/ 10 января 2019

представил общие лямбды, которые позволили написать следующее:

auto func = [](auto a, auto b){
    return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");

Совершенно очевидно, что эта общая лямбда func работает так же, как шаблонная функция func будет работать.

Почему комитет C ++ решил добавить синтаксис шаблона для общей лямды?

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Новый "знакомый синтаксис шаблона" для лямбд, введенный в C ++ 20 делает такие конструкции, как for_types и for_range жизнеспособными и более удобочитаемо по сравнению с альтернативами C ++ 17.

(источник: итерации во время компиляции с C ++ 20 лямбда-выражений )

Еще одна интересная вещь, которую можно сделать на общих лямбдах C ++ 14 и C ++ 17, - это непосредственный вызов operator() путем явной передачи параметра шаблона:

C ++ 14:

   auto l = [](auto){ };
   l.template operator()<int>(0);

C ++ 20:

  auto l = []<typename T>(){ };
  l.template operator()<int>();

Приведенный выше пример C ++ 14 совершенно бесполезен: нет способа ссылаться на тип, предоставленный для operator() в теле лямбды, без присвоения аргументу имени и использования decltype. Кроме того, мы вынуждены передавать аргумент, хотя он может и не понадобиться.

Пример C ++ 20 показывает, как T легко доступен в теле лямбды и что теперь нулевая лямбда может быть произвольно задана. Это будет очень полезно для реализации вышеупомянутых конструкций времени компиляции

0 голосов
/ 10 января 2019

Предложение , которое было принято в C ++ 20, имеет длинный раздел мотивации с примерами. Предпосылка этого такова:

Есть несколько ключевых причин, по которым текущий синтаксис для определения общие лямбды автор считает недостаточными. Суть этого что некоторые вещи, которые можно легко сделать с помощью обычных шаблонов функций требовать значительных прыжков с обручем, чтобы сделать их с обычными лямбдами, или не может быть сделано вообще. Автор считает, что лямбды ценны достаточно, чтобы C ++ поддерживал их так же хорошо, как и обычные функции шаблоны.

Ниже приведено немало примеров.

0 голосов
/ 10 января 2019

C ++ 14 Общих лямбд - это очень крутой способ генерировать функтор с operator (), который выглядит следующим образом:

template <class T, class U>
auto operator()(T t, U u) const;

Но не так:

template <class T>
auto operator()(T t1, T t2) const; // Same type please

Не так:

template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please

Не так (хотя это немного сложно на самом деле использовать):

template <class T>
auto operator()() const; // No deduction

Лямбды C ++ 14 хороши, но C ++ 20 позволяет нам реализовать эти случаи без хлопот.

0 голосов
/ 10 января 2019

Поскольку вы можете использовать шаблонные лямбды в C ++ 20, вы можете ограничить свои типы более простым способом, чем выражение SFINAE:

auto lambda = []<typename T>(std::vector<T> t){};

Эта лямбда будет работать только с векторными типами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...