2014-12-27 10 views
5

Sto cercando di capire enum che è stato definito con gli specificatori del nome nidificato. Ciò che la norma dice è N4296:7.2/4 [dcl.enum]:Enum introdotto usando la dichiarazione

Se il tasto enum è seguito da un nested-nome-identificatore, il enum-specificatore deve fare riferimento a un'enumerazione che in precedenza era dichiarati direttamente nella classe o spazio dei nomi di che il nested-nome-specificatore riferisce (cioè né ereditato né introdotto da una dichiarazione using), e l'enumerazione-specificatore apparirà in uno spazio racchiudente dichiarazione precedente.

Bene, perché funziona il seguente esempio, quindi?

#include <iostream> 

namespace A 
{ 
    namespace B 
    { 
     enum E : int; 
    } 
} 
namespace C 
{ 
    using A::B::E; 
} 

enum C::E : int { x = 2 }; 

int main() 
{ 
} 

DEMO

Nel namescape C, abbiamo dichiarato enum E utilizzando dichiarazione, e quindi di cui con la definizione enum. Il compilatore potrebbe aver generato un errore, ma non l'ha fatto. Cosa c'era di sbagliato, dov'era l'incomprensione?

+3

Sembra che tu abbia trovato un bug del compilatore. –

+0

@ T.C. Quindi, in generale, il seguente codice non dovrebbe funzionare troppo http://coliru.stacked-crooked.com/a/b4e682437a639a1b giusto? –

+0

@ T.C. Non potresti avere un esempio con l'eredità? –

risposta

2

Chiaramente, per i motivi che fornisci, questo è un bug del compilatore.
È interessante notare che sia Clang 3.5.0 sia GCC 4.9 accettano il programma.

Problemi correlati