2010-02-10 11 views
6

Credo che il nuovo standard C++ consente un "ambito" in più per i tipi enumerati:`typedef enum {} t` consente gli identificatori dell'elemento enum con scope in C++ 0x?

enum E { e1, e2 }; 

E var = E::e1; 

Poiché so un sacco di file sorgente contenenti il ​​vecchio stile C enum typedef, mi sono chiesto se il nuovo standard permetterebbe utilizzando il typedef per questi tipi enumerati altrimenti anonimi:

typedef enum { d1, d2 } D; 
D var = D::d1; // error? 
+0

Direi che "D" definito con typedef è per scopi pratici equivalente a un appropriato 'enum D {}' e quindi le stesse regole si applicano ad entrambi. Quindi no, non dovrebbe essere un errore in C++ 0x. – Manuel

+1

+1 per chiamarlo finalmente C++ 1x :) –

+1

Preferisco C++ 0x perché questo è il termine usato da Stroustroup stesso. – Manuel

risposta

5

il nuovo standard sarà aggiungere un nuovo tipo di forte enum, ma la sintassi sarà leggermente diversa, e le enumerazioni vecchio stile saranno compatibili (codice valido in C + +03 sarà valido C++ 0x code) quindi non dovrai fare nulla per mantenere valido il codice legacy (no il typedef, non altro).

enum class E { e1, e2 }; // new syntax, use E::e1 
enum E2 { e1, e2 }; // old syntax, use e1 or E2::e1 (extension) 

C'è un C++ FAQ here che si occupa di questo particolare problema.

+1

Penso che l'OP sappia che il typedef non è necessario, è solo preoccupato del codice C legacy che lo usa. – Manuel

+0

Il codice legacy userà le enumerazioni vecchio stile e quelle enumerate (quella nell'OP) porteranno i nomi all'interno dell'ambito. Sto modificando la risposta in modo che sia più chiara. –