Ответ 1
Тип
T
, содержащий тип заполнителя и соответствующий инициализаторe
, определяется следующим образом:
- для параметра шаблона непигового типа, объявленного типом, который содержит тип заполнителя,
T
является объявленным типом параметра непигового шаблона, аe
является соответствующим аргументом шаблона.
Это, по-видимому, предполагает, что выведенный тип будет decltype(Enum1::Value)
, а значение будет Enum1::Value
.
Является ли decltype(Enum1::Value)
равным decltype(Enum2::Value)
? Этот код...
static_assert(std::is_same_v<decltype(Enum1::Value), decltype(Enum2::Value)>);
... не удается скомпилировать как с clang++ 6, так и g++ 8.
Я думаю, что вы, возможно, обнаружили ошибку в gcc. Как отметил Йоханнес Шауб в комментариях, там также в пользу gcc-поведения.
Откроется отчет об ошибке: # 79092.
Также обратите внимание, что следующий код принят обоими компиляторами:
template <typename T, T> struct Foo;
template <> struct Foo<decltype(Enum1::Value), Enum1::Value> { };
template <> struct Foo<decltype(Enum2::Value), Enum2::Value> { };
template <auto>
ведет себя иначе, чем это было бы (IMHO), удивляющее и нежелательное.