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()
{
}
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?
Wygląda na to, że znalazłeś błąd kompilatora. –
@ T.C. Więc generalnie poniższy kod nie powinien działać zbyt http://coliru.stacked-crooked.com/a/b4e682437a639a1b prawda? –
@ T.C. Nie możesz uzyskać przykładu z dziedziczeniem? –