Considerate questo codice:iniettato nome della classe del compilatore discrepanza
struct foo{};
int main() {
foo::foo a;
}
mi aspetto che questo sia ben formato, dichiarando una variabile di tipo foo
dalla norma in [class]/2 (N4140, sottolineatura mia) :
Una classe nomeviene inserito nel campo di applicazione in cui è dichiarata immediatamente dopo la classe nomeè visto. Il nome è inoltre inserito nell'ambito della classe stessa; questo è noto come nome-classe iniettata. Ai fini del controllo dell'accesso, il nome della classe immessa viene trattato come se fosse un nome membro pubblico.
clang 3.6.0
concorda con me, compilando il codice sopra senza avvertenze applicabili con -Wall -pedantic
.
gcc 5.2.0
non è d'accordo, fornendo il seguente messaggio di errore:
main.cpp: In function 'int main()':
main.cpp:5:5: error: 'foo::foo' names the constructor, not the type
foo::foo a;
È possibile che questo detiene, non importa quanto sia profonda la nidificazione dei nomi delle classi iniettati, per esempio foo::foo::foo::foo
.
Esiste una regola che impone che il costrutto venga interpretato come costruttore in quel contesto o si tratta di un bug gcc
? O sto interpretando erroneamente la citazione degli standard?
Clang ha un numero di bug con la sua gestione dei nomi delle classi immesse. Questo è uno di loro. –
Molto strettamente correlati: http://stackoverflow.com/questions/29681449/program-being-compiled-differently-in-3-major-c-compilers-which-one-is-right –