Подтвердить что ты не робот

Почему инициализируется сильно типизированное перечисление с целым числом без static_cast?

enum class E
{};

int main()
{
    E e1{ 0 }; // ok

    E e2 = 0; // not ok
    // error : cannot initialize a variable of
    // type 'E' with an rvalue of type 'int'
}

Мой компилятор clang 4.0 с опцией -std=c++1z.

Ожидается, что E e2 = 0; не работает, потому что E строго типизирован. Однако меня удивило, что E e1{ 0 }; должно быть в порядке.

Почему синтаксическое перечисление может быть инициализировано целым числом без static_cast?

4b9b3361

Ответ 1

Просмотр reference с использованием списков intializers разрешен с С++ 17:

Оба типа перечисления и типы неперечисленных перечислений, базовый тип фиксирован, может быть инициализирован из целого без cast, используя инициализацию списка, если выполняется все следующее:

  • инициализация - инициализация прямого списка
  • список инициализаторов имеет только один элемент
  • перечисление является либо облачным, либо не облачным с фиксированным типом
  • преобразование не сужается

Clang поддерживает это с версии 3.9 (в соответствии с страница статуса реализации)

GCC поддерживает это с версии 7 (в соответствии со страница поддержки стандартов)

См. это предложение С++ для дополнительного контекста и мотивации: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf