Новый «знакомый синтаксис шаблонов» для лямбда-выражений, представленный в C ++ 20, делает такие конструкции, как for_types
и, for_range
жизнеспособными и намного более удобочитаемыми по сравнению с альтернативами C ++ 17.
(Источник: итерация во время компиляции с лямбда-выражениями C ++ 20 )
Еще одна интересная вещь, которую можно сделать в общих лямбда-выражениях C ++ 14 и C ++ 17, - это прямой вызов operator()
путем явной передачи параметра шаблона:
С ++ 14:
auto l = [](auto){ };
l.template operator()<int>(0);
С ++ 20:
auto l = []<typename T>(){ };
l.template operator()<int>();
Приведенный выше пример C ++ 14 совершенно бесполезен: нет способа ссылаться на тип, предоставленный operator()
в теле лямбда-выражения, без указания имени аргумента и использования decltype
. Кроме того, мы вынуждены передавать аргумент, даже если он нам может не понадобиться.
В примере C ++ 20 показано, как легко получить доступ к T в теле лямбда-выражения и что теперь можно произвольно создавать шаблон нулевого лямбда-выражения. Это будет очень полезно для реализации вышеупомянутых конструкций времени компиляции.