Совместимо ли расположение типов перечисления с их базовым типом?
Я просматриваю n3690
черновик предстоящего C++14
стандарт, и я вижу в разделе 7.2
параграф 9
:
Два типа перечисления совместимы с макетом, если они имеют один и тот же базовый тип.
Однако я не могу найти ничего, что говорит, что тип перечисления совместим с его базовым типом. Мне кажется очевидным, что это должно следовать с учетом разумной семантики того, что означает "базовый тип", но действительно ли это гарантировано стандартом?
1 ответ
НЕТ, в Стандарте нет черной буквы, которая бы указывала на это. Самое близкое, что можно получить - это пункт 7 этого же абзаца.
7 [...] базовый тип является целочисленным типом, который может представлять все значения перечислителя, определенные в перечислении. Если ни один целочисленный тип не может представлять все значения перечислителя, перечисление некорректно сформировано. [...]
Кроме того, 4.5 Интегральные рекламные акции [conv.prom] говорит
4 Значение типа перечисления с незаданной областью, базовый тип которого фиксирован (7.2), может быть преобразовано в значение его базового типа.
Как указано в комментариях, могут быть (хитрые IMO) реализации, которые имеют различную последовательность между enum и его базовым типом. Это будет проблема качества реализации. Для всех практических целей, совместимость макета следует ожидать.