c ++ 14 представили общие лямбды, которые позволили написать следующее:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Совершенно очевидно, что эта общая лямбда func
работает так же, как и шаблонная функция func
.
Почему комитет C ++ решил добавить синтаксис шаблона для общей lamda?
c++
c++14
c++20
generic-lambda
coder3101
источник
источник
Ответы:
Общие лямбда-выражения C ++ 14 - отличный способ сгенерировать функтор с
operator ()
который выглядит следующим образом:Но не так:
Не так:
И не так (хотя на самом деле это немного сложно использовать):
Лямбда-выражения C ++ 14 подходят, но C ++ 20 позволяет без проблем реализовать эти случаи.
источник
(auto a, decltype(a) b)
в C ++ 14.b
не выводится, и его аргумент будет неявно преобразован в типa
вместо.Поскольку вы можете использовать шаблонные лямбды в C ++ 20, вы можете ограничить свои типы более простым способом, чем выражение SFINAE:
Эта лямбда будет работать только с векторными типами.
источник
consteval
связано с новым синтаксисом? Это круто и все такое, но я не понимаю актуальности.В предложении, которое было принято в C ++ 20, есть длинный раздел мотивации с примерами. Предпосылка этого такова:
После этого довольно много примеров.
источник
(Источник: итерация во время компиляции с лямбда-выражениями C ++ 20 )
Еще одна интересная вещь, которую можно сделать в общих лямбда-выражениях C ++ 14 и C ++ 17, - это прямой вызов
operator()
путем явной передачи параметра шаблона:С ++ 14:
С ++ 20:
Приведенный выше пример C ++ 14 совершенно бесполезен: нет способа ссылаться на тип, предоставленный
operator()
в теле лямбда-выражения, без указания имени аргумента и использованияdecltype
. Кроме того, мы вынуждены передавать аргумент, даже если он нам может не понадобиться.В примере C ++ 20 показано, как легко получить доступ к T в теле лямбда-выражения и что теперь можно произвольно создавать шаблон нулевого лямбда-выражения. Это будет очень полезно для реализации вышеупомянутых конструкций времени компиляции.
источник