注:この質問は、name space
ではなくについてnamespace
です。
C ++標準にはへの参照がいくつかありますがname space
、これの定義はわかりません。標準では、ラベルとマクロは異なる名前空間にあると規定されています。への他のすべての参照name space
は、このようにC / C ++互換性セクションにあります(現在のドラフト):
これは、CとC ++の間のいくつかの非互換性の1つであり、新しいC ++名前空間定義に起因する可能性があります。この場合、名前を単一のスコープ内でタイプおよび非タイプとして宣言して、非タイプ名で非表示にすることができます。タイプ名。キーワードclass、struct、unionまたはenumを使用してタイプ名を参照する必要があります。この新しい名前空間の定義は、C ++プログラマーに重要な表記上の便宜を提供し、ユーザー定義型の使用を基本型の使用に可能な限り類似させるのに役立ちます。
この新しい名前空間の定義は何ですか?規格のどこにありますか?正確なルールは何ですか?ルールは「非タイプはタイプを非表示にする」よりも複雑なようです。同様に、これはコンパイルされません:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
しかし、これは:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
そして、これもコンパイルされません:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1
、もう1つはマクロ用[cpp]/8
です。