Почему перечисления считаются составными?

Массивы, функции, указатели, ссылки, классы, объединения, перечисления и указатели на члены являются составными типами.

Мое понимание составного типа заключается в том, что оно основано на других типах. Например, T[n], T* и T& основаны на T. Тогда какой другой тип является перечислением, основанным на?

Или, если мое понимание составных типов неверно, что конкретно это касается типа, который делает его составным? Является ли соединение просто синонимом для пользовательского?

Ответы

Ответ 1

В С++ типы перечислений являются скалярными типами, но в то же время они являются составными типами, поскольку они построены поверх некоторого фундаментального интегрального типа. В случае массива или указателя вы явно укажете "базовый" тип, но в случае перечисления конкретный базовый тип интеграла выбирается неявно и автоматически реализацией. У вас нет ручного контроля над базовым интегральным типом, который по-прежнему не дисквалифицирует типы перечислений как составные по своей природе.

Некоторые компиляторы (а также будущий С++ стандарт С++ 0x) позволяют пользователю указывать базовый целочисленный тип для данного типа перечисления, что делает его более очевидным, что он на самом деле является составным типом. См. здесь для таких примеров, как

enum class Color : char { red, blue };