C++, вопрос про инициализацию объекта типа enum class

Рассмотрим следующий код:

enum class Variants
{
    FIRST = -1,
    SECOND = 1
};

Variants variant{};

Скажите, пожалуйста, что и почему должно оказаться в variant после указанной инициализации?

Эксперимент показывает, что в variant оказывается 0. Хотя в перечислении нет такого элемента.


Ответы (2 шт):

Автор решения: AR Hovsepyan

В данном случаи членами перечисления являются целочисленные именованные константы FIRST и SECOND, но экземпляр типа может принимать и другие значения:

Variants variant = Variants{ 12 };
variant = Variants(0); 

В последнем случаи, практически инициализируется значением по умолчанию, поскольку биты интегральных типов по умолчанию инициализируются нулем.

Variants variant{}; это аналогичная инициализация _ инициализировать variant значением по умолчанию. Вся разница в том, что кроме Variants{-1} и Variants{1}, все остальные константы будут неименованными.

→ Ссылка
Автор решения: HolyBlackCat

У enum class underlying type по умолчанию - int. Так что в нем можно хранить любое значение intа.

Даже если бы это был обычный enum без указания underlying type, 0 все равно был бы допустимым значением. В такой enum влезает любое число, которое влезло бы в битовое поле минимальной длины, достаточной для представления всех элементов этого enum'а (вроде бы, если нет отрицательных элементов, то воображаемое битовое поле беззнаковое).

→ Ссылка