Преобразование перечисления в перечисление через 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 как целочисленный тип с несколькими значениями, явно определенными с помощью меток.

Другие вопросы по тегам