Игнорирование того факта, что объявление lambda1
не является constexpr
и, следовательно, не является константным выражением и, следовательно, никогда не может использоваться в качестве параметра шаблона нетипичного типа (NTTP) независимо от чего-либо еще, основная причина этого не допускается, что лямбды не являются чем-то особенным в C ++. Лямбда - это просто определенный пользователем тип, созданный компилятором со специализированным конструктором, членами на основе вашего списка захвата и перегрузкой operator()
в соответствии с телом и сигнатурой лямбда-функции. Лямбда ничего не делает, что без них невозможно.
В C ++ лямбда - это просто сокращенная запись; ничего более.
Таким образом, если определяемые пользователем типы не могут использоваться в качестве NTTP, а лямбды являются определяемыми пользователем типами, то нельзя использовать лямбда-выражения в качестве NTTP. Вот почему они запрещены.
И обратите внимание, что, хотя C ++ 20 допускает использование некоторых пользовательских типов в качестве NTTP, стандарт в настоящее время предлагает без гарантий относительно может ли какая-то конкретная лямбда использоваться в качестве NTTP. Определенный пользователем тип, который используется в качестве NTTP, должен обеспечивать строгое структурное равенство, и ничто в стандарте не требует, чтобы любые лямбды, даже без захвата, обеспечивали строгое структурное равенство. Реализация может сделать это, но такой код непереносим.