2014-12-27 11 views
5

Próbuję zrozumieć wyliczenie, które zdefiniowano za pomocą specyfikatorów nazw zagnieżdżonych. Co średnia mówi jest N4296:7.2/4 [dcl.enum]:Enum wprowadzony przy użyciu deklaracji

Jeśli enum-key następuje zagnieżdżonego-NAME specyfikatorem, enum-specifier odnoszą się do wyliczenia, które zostało wcześniej zadeklarowane bezpośrednio w klasie lub nazw do których nested-name-specifier odnosi (czyli ani dziedziczone ani wprowadzony przez stosując-deklaracji), a enum-specifier muszą być podawane w nazw załączając poprzednią deklarację.

Dlaczego więc działa poniższy przykład?

#include <iostream> 

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

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

int main() 
{ 
} 

DEMO

W namescape C, zadeklarowaliśmy enum E za pomocą oświadczenia, a następnie skierowane do niej z definicji enum. Kompilator mógł zgłosić błąd, ale nie zrobił tego. Co było nie tak, gdzie było nieporozumienie?

+3

Wygląda na to, że znalazłeś błąd kompilatora. –

+0

@ T.C. Więc generalnie poniższy kod nie powinien działać zbyt http://coliru.stacked-crooked.com/a/b4e682437a639a1b prawda? –

+0

@ T.C. Nie możesz uzyskać przykładu z dziedziczeniem? –

Odpowiedz

2

Oczywiście, z przyczyn, które podajesz, jest to błąd kompilatora.
Co ciekawe, zarówno Clang 3.5.0, jak i GCC 4.9 akceptują program.

Powiązane problemy