¡Bienvenido a C++!
por algo aún más divertido probar esto:
#include <string>
int main(int argc, const char *argv[])
{
std::string s;
s = 3.141592654;
return 0;
}
¿Por qué se compilan? La razón es que las reglas del lenguaje lo dicen.
En este caso funky, la explicación "oficial" sobre por qué compila este ejemplo es que parecía correcto permitir std::string::operator+=(char)
(IMO correcto y lógico desde un punto de vista pragmático) y "por lo tanto" también asignación de char (IMO ilógico no -sequitur). Pero los caracteres son ints (ilógico, pero el patrimonio C) y los dobles se pueden convertir implícitamente en enteros (ilógico, pero el patrimonio C). Por lo tanto, en C++ es ilógico (pero legal) asignar un doble a una cadena.
No te sientas mal si no lo sabías, la mayoría de los programadores de C++ que he mostrado están desconcertados por la razón por la cual un disparate compila y piensa en otros errores semánticos o de compilación.
En el caso de su pregunta, la razón es que las enumeraciones son como en algún contexto (probablemente debido a la herencia en casos de uso) pero no como en otros contextos. Es absurdo, pero es lo que exige el estándar.
Si se siente incómodo con esta aparente ausencia de lógica, recuerde que C++ es principalmente el resultado de una larga historia e incluso de un comité (!) Así que la lógica realmente no tiene mucho que ver con eso. Esto también implica que uno no puede usar la lógica para evitar el estudio de C++: no importa cuán inteligente sea usted, no hay manera de que adivine los accidentes históricos y las decisiones políticas de los comités.
La alta complejidad de C++, esta ausencia de lógica en muchos lugares y la presencia de undefined behavior daemons
en lugar de runtime error angels
es también lo que IMO básicamente descarta aprender C++ por experimentación.
Elija un buen libro (o unos pocos) y léalo (les) de principio a fin ... desafortunadamente no hay otra manera. Mis sugerencias son: "El lenguaje de programación C++" (Stroustrup), "C++ efectivo" & "C++ más efectivo" (Meyers), "Preguntas frecuentes sobre C++" (Cline/Lomow/Girou).
C++ es una arma bastante poderosa y agradable de poseer, pero acércala desde el lado equivocado y puede convertirse en la peor de tus pesadillas. Asumir que puedes entenderlo simplemente usando lógica es un enfoque equivocado (y no porque tu lógica sea débil, sino porque C++ no es solo lógica).
no debería ser el caso willf compilar ser: 'variable = EB_Element;'? – Donotalo
@Donotalo: Reparado, gracias. – sharptooth