2014-11-10 18 views
5

Se un riferimento a un nome esistente in uno spazio dei nomi senza nome e nello spazio dei nomi denominato locale genera un errore per ambiguità o la risoluzione è ben definita? Sto vedendo il seguente lavoro benissimo su G ++ e Clang, meno bene su MSVC.Risoluzione nomi dei nomi senza nome e nome

namespace Foo 
{ 
    class Bar 
    { 
    public: 
     int x; 
    }; 
} 

namespace 
{ 
    class Bar 
    { 
    public: 
     int y; 
    }; 
} 

namespace Foo 
{ 

void tester() 
{ 
    Bar b; 
} 

} 

int main() 
{ 
    Foo::tester(); 
    return 0; 
} 

risposta

3

GCC e Clang hanno ragione. Entro Foo::tester, un uso non qualificato di Bar fa riferimento in modo non ambiguo a Foo::Bar.

ricerca Unqualified è specificato da C++ 11 3.4.1/1:

scopi vengono ricercati dichiarazione nell'ordine indicato in ciascuna delle rispettive categorie ; la ricerca del nome termina non appena viene trovata una dichiarazione per il nome.

Gli scopi cercato per l'uso di un nome in una funzione sono elencati in 3.4.1/6:

Un nome utilizzato nella definizione di una funzione [...] che è un membro del namespace N [...] deve essere dichiarato prima del suo utilizzo nel blocco [...] o, deve essere dichiarato prima del suo utilizzo nello spazio dei nomi N o, se N è uno spazio dei nomi annidato, deve essere dichiarato prima del suo uso in uno dei namespace che racchiudono N.

In questo caso, la funzione è un membro di Foo, così Foo è cercato prima delle allegando namespace (globale), che include il namespace anonimo. Foo::Bar si trova lì e la ricerca termina.

Problemi correlati