【发布时间】:2020-03-17 12:05:46
【问题描述】:
注意:这个问题是关于name space,而不是namespace。
C++ 标准有一些对name space 的引用,但我没有看到它的定义。标准规定标签和宏位于不同的名称空间中。所有其他对 name space 的引用都在 C/C++ 兼容性部分,如下所示 (current draft):
这是 C 和 C++ 之间为数不多的不兼容之一,可归因于 新的 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
【问题讨论】:
-
实际的观点是命名空间是一个具有所有公共成员(子类)的单例类。请不要私刑我:-)
-
@peterh-ReinstateMonica 再次阅读问题
-
FWIW,您的链接链接到相关部分:受影响的子条款:[class.name] [另请参阅 [dcl.typedef]] 您可以查看这些部分以了解规则有效。
-
至少有两个命名空间:一个用于标签
[stmt.label]/1,一个用于宏[cpp]/8。 -
这有点有趣(对我来说),描述和示例都显示了与基本原理所提到的相反的内容;隐藏非类型名称的类型名称。鉴于草稿状态,我希望该段落会发生变化。
标签: c++ namespaces