Hinweis: Bei dieser Frage geht es name spacenicht um namespace.
Der C ++ - Standard enthält einige Verweise auf name space, aber ich sehe die Definition dafür nicht. Die Standards besagen, dass sich Beschriftungen und Makros in unterschiedlichen Namensräumen befinden. Alle anderen Verweise auf name spacebefinden sich im Abschnitt zur C / C ++ - Kompatibilität wie folgt ( aktueller Entwurf ):
Dies ist eine der wenigen Inkompatibilitäten zwischen C und C ++, die der neuen C ++ - Namensraumdefinition zugeordnet werden können, bei der ein Name als Typ und als Nicht-Typ in einem einzelnen Bereich deklariert werden kann, wodurch der Nicht-Typ-Name den Namen verbirgt Typname und erfordert, dass die Schlüsselwörter class, struct, union oder enum verwendet werden, um auf den Typnamen zu verweisen. Diese neue Namensraumdefinition bietet C ++ - Programmierern wichtige Notationskomfort und hilft dabei, die Verwendung der benutzerdefinierten Typen der Verwendung grundlegender Typen so ähnlich wie möglich zu machen.
Was ist diese neue Namensraumdefinition ? Wo finde ich es im Standard? Was sind die genauen Regeln? Die Regeln scheinen komplizierter zu sein als "Nicht-Typen verstecken Typen". Das wird nicht kompiliert:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Aber das tut:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
Und das kompiliert auch nicht:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1und einen für Makros [cpp]/8.