Является ли следующий код правильно сформированным C ++ 17?
template <typename T, int = [](auto t) { decltype(t)::invalid; return 0; }(T{})>
constexpr int f(T) { return 0; }
constexpr int f(...) { return 1; }
static_assert(f(0) == 1);
clang и edg принимают его, в то время как msvc и gcc 1 отклоняют его.Я не могу найти ничего, что говорило бы, что это серьезная ошибка, но я также не могу найти ничего, что говорило бы, что это ошибка вычета.
В C ++ 20 есть этот параграф( [temp.deduct] p9 ):
A лямбда-выражение , появляющееся в типе функции или параметре шаблона, не считается частью непосредственногоконтекст для целей вывода аргумента шаблона.
, который проясняет, что лямбда не является частью непосредственного контекста.Но как насчет C ++ 17?
1 : в этом контексте у gcc есть ошибка с auto
, но перезапись ее с использованием явных параметров шаблона для лямбды дает вамта же ошибка.