2012-11-29 8 views
7

C++ 03 Standardowe 7.3.1.1 [namespace.unnamed] Punkt 1: (i C++ 11 standardzie z wykorzystaniem podobnej definicji)C++ Nienazwana (anonimowe) nazw definicja

Nienazwana-namespace- definicja zachowuje się tak, jakby zostały zastąpione przez

namespace unique { /* empty body */ } 
using namespace unique; 
namespace unique { namespace-body } 

Dlaczego nie jest to po prostu następującej definicji?

namespace unique { namespace-body } 
using namespace unique; 

boku pytanie MSDN określa, w drugiej formie. Czy to technicznie narusza Standard?

+1

Sądzę, że dzieje się tak dlatego, że w "przestrzeni nazw" uzyskujesz dostęp do jednostek bez dodatkowych kwalifikacji, co wymaga już użycia "unikalnego obszaru nazw". –

+3

@mat w ciele przestrzeni nazw można zawsze odwoływać się do rzeczy zdefiniowanych w tej przestrzeni nazw bez kwalifikacji –

+0

@ JohannesSchaub-litb: Wiem, zastanawiałem się nad skutkami starć z otaczającym środowiskiem, chociaż –

Odpowiedz

7

Nie można tego robić

namespace { typedef int a; ::a x; } 

Należy zauważyć, że w kolejnym namespace { ... }, nagle można. Byłoby to okropnie niespójne.

zauważyć także tę sprawę, z dwóch różnych ważnych rezultatów

namespace A { void f(long); } 
using namespace A; 

namespace { 
    void f(int); 
    void g() { 
    ::f(0); 
    } 
} 

ISO C++, to wywołuje wersję fint. W swojej alternatywnej definicji nazywa się wersja long.

+2

Zajęło mi trochę czasu Z Twojej odpowiedzi wynika, że ​​to, co masz na myśli, jest tym, co wyrażam jako "definicja w standardzie zapewnia, że ​​nazwy zadeklarowane w ciele przestrzeni nazw mogą być przywoływane w przestrzeni nazw-ciała przez pełne kwalifikowanie ich przy użyciu globalnej przestrzeni nazw. Na przykład ..." –