Questo è stato standardizzato, proposal 2764: Forward declaration of enumerations (rev. 3) ha consentito la dichiarazione diretta di enumerazione se si specifica il tipo sottostante, mentre prima non era possibile.
Il motivo principale è che quando il tipo sottostante non viene specificato, la dimensione è definita dall'implementazione e può dipendere dai valori dell'enumeratore. Dal progetto C++ 11 sezione standard 7.2
[dcl.enum]:
Per un'enumerazione cui tipo sottostante non è fisso, il sottostante tipo è un tipo integrale che può rappresentare tutte le enumeratore Valori definito nell'enumerazione. Se nessun tipo integrale può rappresentare tutti i valori dell'enumeratore , l'enumerazione non è corretta. È definito dall'implementazione il tipo integrale utilizzato come tipo sottostante eccetto per il fatto che il tipo sottostante non deve essere maggiore di int a meno che il valore di un enumeratore non possa rientrare in un int interno o senza segno int. Se l'enumeratore-elenco è vuoto, il tipo sottostante è come se l'enumerazione aveva un solo enumeratore con valore 0.
Quando passare il valore ha senso che non conoscendo il tipo sottostante è un problema, ma perché è un problema quando si tratta di un puntatore o di un riferimento? Questo è importante dal momento che a quanto pare su alcune architetture, char * e int * possono avere dimensioni diverse, come indicato in questo comp.lang.c++ discussion: GCC and forward declaration of enum:
[...] Mentre la maggior parte delle architetture potrebbe non essere un problema, in alcune architetture il puntatore avrà una dimensione diversa, nel caso si tratti di un puntatore char . Quindi finalmente il nostro compilatore immaginario non avrebbe idea di cosa mettere lì per ottenere un ColorsEnum * [...]
Abbiamo la seguente risposta StackOverflow per riferimento, che descrive il caso in cui char* can be larger than int*, che esegue il backup l'affermazione nella discussione di cui sopra.
Alcuni more details on the possible sizes of pointers come char *
e void *
sono le due eccezioni principali qui e quindi altri puntatori di oggetti non dovrebbero avere gli stessi problemi. Quindi sembra che questo caso finisca per essere unico per le enumerazioni.
fonte
2015-03-13 15:20:23
È anche più cauto di quanto si pensi: penso che msvc forza le enum non registrate a 32 bit. – Yakk
@Yakk lo penso anch'io. Ma perché la dimensione dovrebbe essere rilevante comunque? – nyarlathotep108
Non sono sicuro che sia la dimensione che è rilevante, ma piuttosto, la cosa chiaramente non è la sintassi C++ 03. Invece di una dimensione è possibile utilizzare un'enumerazione con ambito, con una delle parole chiave struct o class. Normali rilevanti: "Una dichiarazione-enum opaca che dichiara un'enumerazione senza ambito non deve omettere l'enum-base." –