b1s*_*sub 11 c++ language-lawyer
似乎有在没有明确的定义声明的点,声明性区域,范围的一个命名空间标识符,除了那些的一个命名空间中的标识符 -根据标准(§3.3.6/ 1).
命名空间定义的声明性区域是其namespace-body.原始命名空间名称表示的潜在范围是由同一个命名空间定义建立的声明性区域的串联...
虽然标准确实讨论了声明的那些- 命名空间定义是声明,但是它不适用于命名空间定义的情况,因为它没有声明符,也没有初始值 -根据标准(§3.3.2/ 1) .
声明的名称是在完整的声明者(第8条)之后和初始化者(如果有的话)之后,除非如下所述......
然后,我如何确定命名空间标识符的那些?
从您引用的标准文本来看,我的解释是您已经回答了自己的问题。
X
正如您所说,命名空间不能有完整的声明符,因为可以在任何命名空间的任何编译单元(即源文件或该源文件包含的标头)中创建一个附加的声明区域namespace X { <new names within this declarative region> }
。
由于永远不可能有命名空间的完整声明,因此永远不可能存在命名空间的声明点。由于没有声明点,因此不存在命名空间标识符之类的东西,也不存在诸如 1 的范围之类的东西。
这意味着命名空间只是一个标签,可以是标识符的一部分。 istream
是命名空间内的标识符std
,该标识符的完整名称(从命名空间声明区域之外的代码引用std
)是std::istream
。所有using namespace std;
要做的就是,当尝试找到潜在标识符的匹配时,foo
告诉编译器在名称空间std
(或其具有可见性的声明性区域)中查找名为的标识符,foo
该标识符将成为候选匹配。[这就是为什么using namespace
如果多个命名空间包含相同的标识符,多个命名空间可能会导致歧义]。