Ответ 1
В программе Undefined Поведение. Значение 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 - тип класса blah blah
- если T - неединичный класс тип бла-бла
- если T - тип массива, тогда blah blah - в противном случае объект инициализируется нулем
Итак, мы попадаем в другую часть. И объекты области пространства имен инициализируются значением