En C, una enumconstante es de tipo int. En C ++, es del tipo enumerado.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
En C, esto es una violación de la restricción , que requiere un diagnóstico ( si se UINT64_MAX excede INT_MAX, lo que muy probablemente lo haga). El compilador AC puede rechazar el programa por completo, o puede imprimir una advertencia y luego generar un ejecutable cuyo comportamiento no está definido. (No está 100% claro que un programa que viola una restricción necesariamente tenga un comportamiento indefinido, pero en este caso el estándar no dice cuál es el comportamiento, por lo que sigue siendo un comportamiento indefinido).
gcc 6.2 no advierte sobre esto. clang lo hace. Este es un error en gcc; inhibe incorrectamente algunos mensajes de diagnóstico cuando se utilizan macros de encabezados estándar. Gracias a Grzegorz Szpetkowski por localizar el informe de error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
En C ++, cada tipo de enumeración tiene un tipo subyacente , que es un tipo entero (no necesariamente int). Este tipo subyacente debe poder representar todos los valores constantes. Entonces, en este caso, ambos en_e_fooy en_e_barson del tipo en_e, que debe tener al menos 64 bits de ancho, incluso si intes más estrecho.