Ответ «потому что стандарт так говорит», конечно, верен, но давайте рассмотрим общие лямбды.
В C ++ 14 и C ++ 17 универсальные лямбды - единственный способ написания шаблоновкод, который я знаю:
auto lambda = [](auto x) { };
lambda.operator()<int>(0);
Технически, вы можете написать любой код шаблона именно с этим.Хотя вам придется много работать, чтобы обойти различные ограничения этого подхода.
Это будет проще в C ++ 20, хотя.С помощью списка параметров шаблона в общих лямбдах вы сможете написать код, подобный следующему:
auto size = []<class T>() { return sizeof(T); };
static_assert(4 == size.operator()<int>());
GCC уже поддерживает этот синтаксис.