对于命名空间标识符<的声明点、声明区域、范围似乎没有明确的定义/strong>,除了那些 namespace 内的标识符——根据标准 (§3.3.6/1)。
The declarative region of a namespace-definition is its namespace-body. The potential scope denoted by an original-namespace-name is the concatenation of the declarative regions established by each of the namespace-definitions in the same...
虽然标准确实讨论了那些声明——命名空间定义是声明,但这不适用于命名空间定义的情况,因为它没有声明符,也不是初始化符——根据标准(§3.3.2/1)。
The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below...
那么,如何确定命名空间标识符呢?
最佳答案
根据您从标准中引用的文字,我的解释是您已经回答了您自己的问题。
正如您所说,命名空间不能有完整的声明符,因为可以在任何命名空间的任何编译单元(即源文件或该源文件包含的 header )中为它创建一个额外的声明区域 X
通过 namespace X { <new names within this declarative region> }
.
因为永远不可能有完整的命名空间声明,所以永远不会有命名空间的声明点。由于没有声明点,因此没有命名空间标识符这样的东西,也没有一个范围这样的东西。
这意味着命名空间只是一个标签,它可以是标识符的一部分。 istream
是命名空间内的标识符 std
,该标识符的完整名称(从命名空间 std
的声明区域之外的代码引用)是 std::istream
.所有 using namespace std;
确实是,当试图找到潜在标识符的匹配项时 foo
是告诉编译器在命名空间 std
中查找(或它具有可见性的声明区域)用于名为 foo
的标识符这将是一场候选比赛。 [这就是为什么using namespace
如果不止一个命名空间包含相同的标识符,那么多个命名空间可能会导致歧义。
关于c++ - namespace 标识符的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247975/