2012-11-29 9 views
7

C++ 03 Standard-7.3.1.1 [namespace.unnamed] Absatz 1: (und C++ 11 Standard verwendet auch ähnliche Definition)C++ unbenannte (anonym) Namespace-Definition

Eine unbenannte-namespace- Definition verhält, als ob es von

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

ersetzt wurden Warum ist es nicht einfach folgende Definition?

namespace unique { namespace-body } 
using namespace unique; 

Side Frage: MSDN definiert durch letztere Form. Verstößt es technisch gegen Standard?

+1

Ich denke, das liegt daran, dass Sie im 'namespace-body' auf die Entitäten ohne zusätzliche Qualifikation zugreifen, was erfordert, dass' using namespace unique' bereits wirksam ist. –

+3

@mat im Körper eines Namespaces kann man sich immer auf Dinge beziehen, die in diesem Namespace definiert sind –

+0

@ JohannesSchaub-litb: Ich weiß, ich habe mich über die Auswirkungen von Zusammenstößen mit der Umgebung Gedanken gemacht –

Antwort

7

Sie konnten das nicht mehr

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

Beachten Sie, dass in einem nachfolgenden namespace { ... }, plötzlich Sie konnten. Das wäre schrecklich widersprüchlich.

Auch diesen Fall bemerken, mit zwei verschiedenen gültigen Ergebnissen

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

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

Mit ISO C++, dies ruft die int Version von f. Mit Ihrer alternativen Definition ruft sie die long Version auf.

+2

Es hat eine Weile gedauert Finde aus deiner Antwort heraus, was du meinst, was ich sagen würde: "Die Definition im Standard stellt sicher, dass Namen, die im Namespace-body deklariert sind, im Namespace-body angesprochen werden können, indem sie vollständig mit dem globalen Namespace qualifiziert werden. Beispielsweise ..." –