Convertire da un tipo di enum a un altro passa per un tipo intero (probabilmente il tipo sottostante del fonte, non sono sicuro).
Una conversione implicita da enum a un tipo intero è consentita sia in C che in C++. Una conversione implicita da un tipo intero a enum è consentita in C, ma non in C++.
Fondamentalmente, il C++ è più sicuro di tipo. Sta cercando di fermare voi di fare questo:
enum {zero, one, two} x;
x = 143; // assigns a value outside the range of the enum
Se si desidera eseguire questa conversione enum-enum in C++, è possibile utilizzare typeof/declspec/typeof spinta o equivalente. In GCC:
int main() {
enum {zero, one, two} x;
enum {zero1, one1, two1} y = two1;
typedef typeof(x) xtype;
x = static_cast<typeof(x)>(y);
}
Tuttavia, non ha senso farlo. Per la maggior parte degli scopi, le enumerazioni (e in particolare quelle anonime) sono "tipi enumerati". Sono semplicemente "implementati" dagli standard C e C++ come numeri interi che indossano cappelli divertenti, ma ciò non significa che lo red
sia "uguale a" hammer
solo perché ognuno di essi appare prima in due enumerazioni diverse (colori e strumenti rispettivamente). static_cast
suggerisce che esiste una relazione tra i due tipi coinvolti. Qualsiasi tipo di enumerazione è "correlato" dal fatto che entrambi hanno un tipo intero sottostante, e quelli sono correlati, quindi la "relazione" in realtà non dice molto. Se scrivi questo codice stai ottenendo una versione piuttosto scadente della sicurezza del tipo.
fonte
2010-03-18 23:47:45
Questa è una domanda brillantemente oscura. –
Felice che ti piaccia! – samoz
Ricorderò questo esempio quando qualcuno mi dice che usano enum perché impedisce di scrivere codice sbagliato. Fondamentalmente, C ti permette di scrivere codice. Se scrivi codice errato, hai un codice errato. L'uso dei cast impliciti è un codice errato e (alcuni) C a quanto pare ti consente di farlo, anche se è pessimo come in questo caso. Ulteriore domanda: è qualcosa che è stato hackerato nel compilatore per "supportare più pienamente" l'uso * err * dell'enum senza nome per creare costanti? Probabilmente così. –