Программа имеет Неопределенное поведение .Значение enummy не определено.Концептуально нет никакой разницы между вашим кодом и следующим кодом:
int main() {
int i; //indeterminate value
std::cout << i; //undefined behavior
};
Если бы вы определили вашу переменную в области именного пространства, ее значение было бы установлено равным 0.
enum SomeEnum {
EValue1 = 1,
EValue2 = 4,
};
SomeEnum e; // e is 0
int i; // i is 0
int main()
{
cout << e << " " << i; //prints 0 0
}
ДонНе удивляйтесь, что e
может иметь значения, отличные от любых значений перечислителя SomeEnum
.Каждый тип перечисления имеет базовый интегральный тип (например, int
, short
или long
), а набор возможных значений объекта этого типа перечисления - это набор значений, которые имеет базовый интегральный тип.Enum - это просто способ удобно назвать некоторые значения и создать новый тип, но вы не ограничиваете значения вашего перечисления набором значений перечислителей.
Обновление: Некоторые цитаты, поддерживающие меня:
Инициализация объекта типа T с нуля означает:
- если T является скалярным типом (3.9), объектустановите значение 0 (ноль), преобразованное в T;
Обратите внимание, что перечисления являются скалярными типами.
Для инициализации значения объекта типа Tозначает:
- если T является типом класса бла-бла
- если T является типом класса без объединения, бла-бла
- если T является типом массива, то бла-бла - в противном случае объект равен нулю-инициализированный
Итак, мы попадаем в другую часть.И объекты области пространства имен инициализируются значением