Ответ 1
Нет, это ошибка компилятора. gcc 7.1 правильно отклоняет код.
Лямбда-выражение - это prvalue, результат результата которого называется замыкающим объектом. Лямбда-выражение не должно появляться в неопубликованном операнде в аргументе шаблона, в объявлении alias, в объявлении typedef или в объявлении шаблона функции или функции вне его тела функции и аргументы по умолчанию.
Как видно из части, выделенной мной полужирным шрифтом, выражение lambda не может появляться в списке аргументов шаблона.
Это также ясно из следующей заметки:
[Примечание. Цель состоит в том, чтобы предотвратить появление лямбда в подписи. - конечная нота]
Если бы я должен был догадаться, я бы сказал, что ошибка возникает, потому что, начиная с С++ 17, lambdas неявно constexpr
, что делает их действительными для вызова в выражениях времени компиляции, таких как аргументы шаблона. Но фактически определение лямбда в аргументе шаблона по-прежнему является незаконным.
Обратите внимание, что это ограничение было снято в С++ 20.:)