L’uso di enumerazioni anonime

Qual è lo scopo delle dichiarazioni anonime di enum come:

 enum { color = 1 }; 

Perché non solo dichiarare int color = 1 ?

Le enumerazioni non occupano spazio e sono immutabili.

Se hai usato const int color = 1; allora si risolverebbe il problema della mutevolezza, ma se qualcuno ha preso l’indirizzo di color ( const int* p = &color; ) allora lo spazio per esso dovrebbe essere assegnato. Questo potrebbe non essere un grosso problema ma, a meno che tu non voglia esplicitamente che le persone siano in grado di prendere l’indirizzo di color , potresti anche impedirlo.

Inoltre, quando si dichiara un campo costante in una class, dovrà essere static const (non vero per il C ++ moderno) e non tutti i compilatori supportano l’inizializzazione in linea dei membri const statici.


Dichiarazione di non responsabilità: questa risposta non dovrebbe essere presa come consiglio di usare enum per tutte le costanti numeriche. Dovresti fare ciò che tu (oi tuoi cow-orker) pensi sia più leggibile. La risposta elenca solo alcuni dei motivi per cui si potrebbe preferire l’uso di un enum .

Questo è un cosiddetto enum trick per dichiarare una costante di interi in fase di compilazione . Il vantaggio è che garantisce che nessuna variabile sia istanziata e quindi non ci sono sovraccarichi di runtime. La maggior parte dei compilatori non introduce comunque un sovraccarico con le costanti integer.

Se questo è vecchio codice, allora enum potrebbe essere stato usato per “enum hack”.

Puoi saperne di più su “enum hack”, ad esempio, in questo link: enum hack

 (1) int color = 1; 

color è modificabile (accidentalmente).

 (2) enum { color = 1 }; 

color non può essere cambiato.

L’altra opzione per enum è,

 const int color = 1; // 'color' is unmutable 

Sia enum che const int offrono esattamente lo stesso concetto; è una questione di scelta. Per quanto riguarda la credenza popolare che enum s salva lo spazio, IMO non esiste alcun vincolo di memoria relativo, il compilatore è abbastanza intelligente da ottimizzare const int quando necessario.

[Nota: se qualcuno tenta di utilizzare const_cast<> su un const int ; provocherà un comportamento indefinito (che è cattivo). Tuttavia, lo stesso non è ansible per enum . Quindi il mio preferito è enum ]

Un uso di questo è quando si esegue la metaprogrammazione del modello, perché gli oggetti enumerati non sono lvalue, mentre static const membri static const sono. Inoltre, era una soluzione comune per i compilatori che non permettevano di inizializzare le costanti integrali statiche nella definizione della class. Questo è spiegato in un’altra domanda .

Quando usi
enum {color = 1}
non stai usando alcuna memoria è come
#define color 1

Se dichiari una variabile
int color=1 Quindi stai acquisendo memoria per un valore che non deve essere modificato.

Non lo vedo menzionato, un altro uso è per valutare le costanti. Attualmente lavoro sul codice che è stato scritto utilizzando Visual Studio 2005 e ora viene portato su android-g ++. In VS2005 potresti avere un codice come questo enum MyOpts { OPT1 = 1 }; e usarlo come MyOpts :: OPT1 – e il compilatore non si è lamentato, anche se non è valido. g ++ riporta un codice come un errore, quindi una soluzione è usare l’enum anonimo come segue: struct MyOpts { enum {OPT1 =1}; }; struct MyOpts { enum {OPT1 =1}; }; e ora entrambi i compilatori sono felici.