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?
GCC seleziona 'N :: A :: i'. Mi chiedo perché. – Barry
@Barry Sono altrettanto confuso, dal momento che mi aspettavo che preferisse la dichiarazione più superficiale, cioè "più vicina" al punto di ricerca. – Columbo