Если мы посмотрим на черновик стандарта C ++ в разделе 5.1.2
Лямбда-выражения в параграфе 2 говорится (курсив мой в будущем):
Оценка лямбда-выражения приводит к временному значению prvalue (12.2). Этот временный объект называется закрывающим объектом. Лямбда-выражение не должно появляться в неоцененном операнде (пункт 5). [Примечание: закрывающий объект ведет себя как функциональный объект (20.8). - конец примечания]
и в разделе 5.19
Постоянные выражения параграфа 2 говорится:
Условное выражение является основным константным выражением, если оно не включает одно из следующего в качестве потенциально оцениваемого подвыражения (3.2), но подвыражения логического И (5.14), логического ИЛИ (5.15), и условные (5.16) операции, которые не оцениваются, не рассматриваются [...]
и имеет следующий маркер:
- лямбда-выражение (5.1.2);
Так почему же лямбда-выражения не разрешены в неоцененном операнде, но разрешены в неоцененных частях константных выражений?
Я вижу, как для неоцененных операндов информация о типе в нескольких случаях (decltype или typeid) не очень полезны, поскольку каждая лямбда имеет уникальный тип. Хотя неясно, почему мы хотели бы разрешить их в неоцененном контексте константного выражения, возможно, чтобы разрешить СФИНАЕ?