2013-02-17 12 views
5
const enum Alpha{ 
    X=9, 
    Y=5, 
    Z=2 
}p; 
int main(){ 
    enum Alpha a,b; 
    a= X; 
    b= Z; 

    p = X; 
    p = Y; 

    printf("%d",a+b-p); 
    return 0; 
} 

Perché p = X e p = Y è consentito nel compilatore MSVC? Questo codice emette 6. Non dovrebbe essere assegnato un valore const all'inizializzazione e mai più?MSVC tipo const enum

+0

assegnerà a a p opere? – Arpit

+0

sì, e l'uscita è 2 in quel caso –

+0

Indicare la versione esatta del compilatore. –

risposta

6

Questo è un bug nel compilatore stesso. Fine della storia.

Infatti, il tuo piccolo codice mostra due errori nel compilatore. Il primo bug è qui per sé:

const enum Alpha{ 
    X=9, 
    Y=5, 
    Z=2 
}p; //declaration of p is ill-formed! 

La dichiarazione di p è mal formati, e quindi il compilatore dovrebbe respingere questo codice, perché p è dichiarato const ma ha lasciato inizializzata. Un tipo const scalare (e pod) deve essere inizializzato in modo da essere ben formata:

const Alpha q;  //ill-formed (same case is with p in your code) 
const Alpha r = X; //well-formed 

Per una spiegazione dettagliata ed estesa, vedere questo:

+0

Oh! Ecco perché non funziona nel mio DevC. – Arpit

+0

Accidenti, ho trovato un bug :(Grazie –

+0

È 'Alpha' non-POD? Davvero? –

1

Sembra un insetto, davvero.

Prima di tutto, gli oggetti globali const devono essere inizializzati quando definiti e l'inizializzazione predefinita non è un'opzione per i tipi di enumerazione. Secondo Paragrafo 8,5/6 della C++ 11 standard:

Per default-inizializzare un oggetto di tipo T significa:

- se T è un gruppo (possibilmente cv-qualificato) tipo di classe (Clausola 9), viene chiamato il costruttore predefinito per T (e l'inizializzazione non è corretta se T non ha un costruttore predefinito accessibile);

- se T è un tipo di matrice, ciascun elemento viene inizializzato di default;

- in caso contrario, non viene eseguita alcuna inizializzazione.

Se un programma richiede l'inizializzazione predefinita di un oggetto di un tipo T qualificato const, il tipo T deve essere un tipo di classe con un costruttore predefinito fornito dall'utente.

In secondo luogo, un oggetto const non può essere assegnato dopo l'inizializzazione.

-2

Modificato per concordare sul fatto che si tratta di un errore del compilatore.

Questo funziona perché il compilatore pensa erroneamente che p sia di tipo Alpha e non const Alpha. Se si riscrive questo come

enum Alpha{.... 
} const p; 

il compilatore correttamente lamentano che una costante non viene inizializzato.

error C2734: 'p' : const object must be initialized if not extern 
error C3892: 'p' : you cannot assign to a variable that is const 

Se si assegna la costante,

enum Alpha{.... 
} const p = Y; 

e rimuovere l'assegnazione a p, tutto viene compilato e funziona come previsto.

+0

* "Funziona perché p è di tipo' Alpha' e non 'const Alpha'" *. QUESTO È ERRATO. Il tipo di 'p' è' const Alpha', come 'const' si applica alla variabile, non alla definizione enum. Inoltre,' const Alpha p' e 'Alpha const sono esattamente la stessa cosa! – Nawaz

+0

Non sono un avvocato linguistico, lo lascerò agli esperti – Thomas

+0

Non è necessario essere "giurista linguistico" o "esperto" per saperlo. La dichiarazione C++ è più che sufficiente – Nawaz