La conversión de un tipo de enumeración a otro pasa por un tipo entero (probablemente el tipo subyacente del fuente, no estoy seguro).
Se permite una conversión implícita de enum a un tipo entero tanto en C como en C++. Se permite una conversión implícita de un tipo entero a enum en C, pero no en C++.
Básicamente, C++ está siendo más seguro. Se trata de intentar que le impida hacer esto:
enum {zero, one, two} x;
x = 143; // assigns a value outside the range of the enum
Si desea realizar esta conversión enumeración-enum en C++, se puede usar typeof/declspec/typeof impulso o equivalente. En GCC:
int main() {
enum {zero, one, two} x;
enum {zero1, one1, two1} y = two1;
typedef typeof(x) xtype;
x = static_cast<typeof(x)>(y);
}
Sin embargo, normalmente no tiene sentido hacerlo. Para la mayoría de los propósitos, las enumeraciones (y especialmente las anónimas) son "tipos enumerados". Simplemente resultan ser "implementados" por los estándares C y C++ como enteros usando sombreros divertidos, pero eso no significa que red
es "igual a" hammer
simplemente porque cada uno aparece primero en dos enumeraciones diferentes (colores y herramientas respectivamente)) static_cast
sugiere que hay una relación entre los dos tipos involucrados. Dos tipos de enum están "relacionados" por el hecho de que ambos tienen un tipo entero subyacente y están relacionados, por lo que la "relación" realmente no dice mucho. Si escribe este código, obtendrá una versión bastante pobre de seguridad tipo.
Esta es una pregunta brillantemente oscura. –
¡Me alegro de que lo disfrutes! – samoz
Voy a recordar este ejemplo cuando alguien me dice que usa enum porque evita escribir código incorrecto. Básicamente, C te permite escribir código. Si escribe un código incorrecto, tiene un código incorrecto. Usar moldes implícitos es un código incorrecto, y (algunos) C aparentemente te permite hacerlo, aunque sea tan malo como este caso. Pregunta adicional: ¿Esto está pirateado en el compilador para "soportar más completamente" el * mis * uso de enum sin nombre para crear constantes? Probablemente. –