¿Cuál es el tipo subyacente de una enum c ++?

Esto puede haber sido respondido en otro lugar, pero no pude encontrar una respuesta adecuada.

Tengo este código:

enum enumWizardPage { WP_NONE = 0x00, WP_CMDID = 0x01, WP_LEAGUES = 0x02, WP_TEAMS = 0x04, WP_COMP = 0x08, WP_DIVISIONS = 0x10, WP_FORMULAS = 0x20, WP_FINISHED = 0x40, }; 

Lo cual es heredado y tengo que modificarlo agregando algunos valores nuevos. El problema es que cada valor debe ser un bit único para que puedan combinarse con un bitmap.

Los valores se establecen usando el formato hexadecimal # x ##, pero me pregunto si este es el máximo que puede almacenar. ¿Cuál será el efecto, si hay alguno, si cambio mi código a

 enum enumWizardPage { WP_NONE = 0x0000, WP_CMDID = 0x0001, WP_LEAGUES = 0x0002, WP_TEAMS = 0x0004, WP_COMP = 0x0008, WP_DIVISIONS = 0x0010, WP_FORMULAS = 0x0020, WP_FINISHED = 0x0040, }; 

Desde estándar C ++ 7.2 / 5:

El tipo subyacente de una enumeración es un tipo integral que puede representar todos los valores del enumerador definidos en la enumeración. Está definido por implementación qué tipo integral se utiliza como tipo subyacente para una enumeración, excepto que el tipo subyacente no debe ser mayor que int a menos que el valor de un enumerador no pueda caber en una int o unsigned int. Si la enumeradora-lista está vacía, el tipo subyacente es como si la enumeración tuviera un solo enumerador con valor 0. El valor de sizeof () aplicado a un tipo de enumeración, un objeto de tipo de enumeración o un enumerador, es el valor de sizeof () aplicado al tipo subyacente.

El tipo de una enumeración de C ++ es la enumeración misma. Su rango es bastante arbitrario, pero en términos prácticos, su tipo subyacente es un int .

Sin embargo, está implícitamente lanzado a int dondequiera que se use.

C ++ 11 cambios

Esto ha cambiado desde C ++ 11, que introdujo enumeraciones escritas a máquina. Una enum no enum ahora se define como al menos el ancho de int (y más ancho si se necesitan valores más grandes). Sin embargo, dado un enum tipado definido de la siguiente manera:

 enum name : type {}; 

Una enumeración del name de tipo tiene un tipo de type subyacente. Por ejemplo, enum : char define una enum del mismo ancho que char lugar de int .

Además, una enum puede tener un ámbito explícito de la siguiente manera:

 enum class name : type { value = 0, // ... }; 

(Donde se requiere name , pero el type es opcional). Una enum declarada ya no se lanzará implícitamente a su tipo subyacente (que requiere un static_cast<> ) y los valores se deben referenciar con un nombre completo. En este ejemplo, para asignar value a una variable enum , debe referirse a ella como name::value .

IIRC está representado como int en la memoria. Pero gcc tiene switch -fshort-enum para que sea el tipo de entero más corto que se ajusta a todos los valores, si necesita ahorrar espacio. Otros comstackdores tendrán algo similar.

El tipo subyacente es el entero más pequeño con signo que corresponde al valor más grande o más pequeño de su enumeración.