2015-04-26 15 views
8

Non è permesso di mettere un namespace e una classe con lo stesso nome in una regione dichiarativa, cioèambiguo ricerca del nome con l'utilizzo di-direttiva

namespace A {} 
class A{}; 

is ill-formed (vedi §3.3.1/4). Tuttavia, si può introdurre il nome di uno dei due tramite una direttiva using:

namespace N { namespace A {int i;} } 

struct A {static int i;}; 

using namespace N; 

int i = A::i; // The global struct, or namespace N::A? 

Questo codice è mal formato? VC++ thinks so, così come Clang:

main.cpp:7:9: error: reference to 'A' is ambiguous 
int i = A::i; 
     ^
main.cpp:3:8: note: candidate found by name lookup is 'A' 
struct A {static int i;}; 
    ^
main.cpp:1:25: note: candidate found by name lookup is 'N::A' 
namespace N { namespace A {int i;} } 
         ^

Tuttavia, GCC accepts it.

Chi ha ragione?

+0

GCC seleziona 'N :: A :: i'. Mi chiedo perché. – Barry

+0

@Barry Sono altrettanto confuso, dal momento che mi aspettavo che preferisse la dichiarazione più superficiale, cioè "più vicina" al punto di ricerca. – Columbo

risposta

6

Il codice è mal formato. Quando si cerca up A, §7.3.4/6 passaggi in:

Se il nome di ricerca trova una dichiarazione di un nome in due diversi spazi dei nomi, e le dichiarazioni non si dichiara la stessa entità e non non dichiara funzioni , l'uso del nome è mal formato.

Qui, gli spazi dei nomi sono namespace globale e N, e le entità sono lo spazio dei nomi N::A e la classe ::A.