C++, вопрос про инициализацию объекта типа enum class
Рассмотрим следующий код:
enum class Variants
{
FIRST = -1,
SECOND = 1
};
Variants variant{};
Скажите, пожалуйста, что и почему должно оказаться в variant после указанной инициализации?
Эксперимент показывает, что в variant оказывается 0. Хотя в перечислении нет такого элемента.
Ответы (2 шт):
В данном случаи членами перечисления являются целочисленные именованные константы FIRST и SECOND, но экземпляр типа может принимать и другие значения:
Variants variant = Variants{ 12 };
variant = Variants(0);
В последнем случаи, практически инициализируется значением по умолчанию, поскольку биты интегральных типов по умолчанию инициализируются нулем.
Variants variant{}; это аналогичная инициализация _ инициализировать variant значением по умолчанию. Вся разница в том, что кроме Variants{-1} и Variants{1}, все остальные константы будут неименованными.
У enum class underlying type по умолчанию - int. Так что в нем можно хранить любое значение intа.
Даже если бы это был обычный enum без указания underlying type, 0 все равно был бы допустимым значением. В такой enum влезает любое число, которое влезло бы в битовое поле минимальной длины, достаточной для представления всех элементов этого enum'а (вроде бы, если нет отрицательных элементов, то воображаемое битовое поле беззнаковое).