Uwaga: to pytanie dotyczy name space
, a nie namespace
.
Standard C ++ zawiera kilka odniesień name space
, ale nie widzę jego definicji. Według standardów etykiety i makra znajdują się w różnych przestrzeniach nazw. Wszystkie pozostałe odniesienia name space
znajdują się w sekcji kompatybilności z C / C ++, takie jak ten ( aktualny projekt ):
Jest to jedna z niewielu niezgodności między C i C ++, którą można przypisać nowej definicji przestrzeni nazw C ++, w której nazwę można zadeklarować jako typ i jako nietyp w jednym zakresie, co powoduje, że nazwa nietypowa ukrywa nazwę wpisz nazwę i wymagając użycia słowa kluczowego klasa, struct, union lub enum w celu odniesienia do nazwy typu. Ta nowa definicja przestrzeni nazw zapewnia programistom C ++ ważne notacyjne ułatwienia i pomaga maksymalnie wykorzystać typy zdefiniowane przez użytkownika do podstawowych typów.
Czym jest ta nowa definicja przestrzeni nazw ? Gdzie mogę to znaleźć w standardzie? Jakie są dokładne zasady? Reguły wydają się bardziej skomplikowane niż „typy ukryte inne niż typy”. Na przykład to się nie kompiluje:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
Ale to powoduje:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
I to się nie kompiluje:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1
i jedna dla makr [cpp]/8
.