Преобразование перечисления в перечисление через int в C++
Допустимо ли преобразовывать перечисление в другое перечисление посредством преобразования int, как показано ниже? Похоже, что у gcc для x64 нет проблем, но стоит ли ожидать чего-то и от других компиляторов и платформ?
Что происходит, когда a
равняется A_third
и не имеет эквивалента в enum_B
?
enum enum_A {
A_first = 0,
A_second,
A_third
};
enum enum_B {
B_first = 0,
B_second
};
enum_A a = A_first;
enum_B b;
b = enum_B(int(a));
1 ответ
Вы должны быть осторожны при этом, из-за некоторых крайних случаев:
Из стандарта C++11 (§7.2,6):
Для перечисления, базовый тип которого не фиксирован, базовый тип является целочисленным типом, который может представлять все значения перечислителя, определенные в перечислении. Если ни один целочисленный тип не может представлять все значения перечислителя, перечисление некорректно сформировано. Определяется реализацией, какой интегральный тип используется в качестве базового типа, за исключением того, что базовый тип не должен быть больше, чем int, если только значение перечислителя не может поместиться в int или unsigned int.
Это означает, что возможно, что enum
является более крупным типом, чем int
поэтому преобразование из enum
в int
может потерпеть неудачу с неопределенными результатами.
С учетом вышеизложенного, возможно преобразовать int
для enum
что приводит к значению перечислителя, что enum
не указывает явно. Неофициально, вы можете думать о enum
как целочисленный тип с несколькими значениями, явно определенными с помощью меток.