Почему компилятор Visual Studio C++ отклоняет перечисление в качестве параметра шаблона?

Я использую компилятор Microsoft Visual Studio 2019 (cl.exe), и он отклоняет некоторый код, принятый и Clang, и GCC, связанный с использованием перечислений в качестве параметров шаблона, где шаблоны специализированы для определенных значений перечисления.

enum Foo {
    Bar,
    Baz
};

template<enum Foo = Bar> class Clazz {

};

template<> class Clazz<Baz> {

};

Компилятор VC++ сообщает о нескольких ошибках специализации шаблона:

<source>(10): error C2440: 'specialization': cannot convert from 'Foo' to 'Foo'
<source>(10): note: Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)

Этот код принят без ошибок как Clang, так и GCC. Это ошибка с VC++?

Замена 'enum Foo' в объявлении шаблона просто 'int' приводит к исчезновению ошибок. Однако это не приемлемый ответ, так как я пытаюсь перенести большую кодовую базу на VC++.

Ответы

Ответ 1

Ваш код будет компилироваться, если вы используете опцию компилятора в режиме соответствия стандартам /permissive- для указания поведения компилятора, соответствующего стандартам.

Вы можете добавить эту опцию в командной строке или в "странице свойств проекта → C/C++ → Язык → Режим соответствия".

Ответ 2

Вам не хватает буквы T:

template<enum Foo T = Bar> class Clazz {

Или иметь дополнительное перечисление:

template<Foo = Bar> class Clazz {

Этот второй намного приятнее, спасибо Франсуа.