格式良好。
using 指令不会在全局命名空间中引入名称i
,但会在查找期间使用。using-declaration使用合格的查找来查找i
;在 [3.4.3.2 p1, p2] 中指定了存在using 指令的合格查找(引自 N4527,当前工作草案):
如果qualified-id的nested-name-specifier 指定了一个命名空间(包括nested-name-specifier为的情况,即指定全局命名空间),则在
nested-name-specifier之后指定的名称在命名空间的范围。[...]::
对于命名空间X
和名称m
,命名空间限定的查找集
S(X,m)定义如下:令S'(X,m)m
是in的所有声明和(7.3.1)X
的内联命名空间集的集合X
. 如果
S'(X,m)不为空,则S(X,m)为S'(X,m);否则,S(X,m)是S(N i ,m)对于使用指令in指定的所有名称空间N i及其内联名称空间集的并集。X
因此,对于合格的查找,第一步是i
直接在由嵌套名称说明符(::
在本例中)指示的命名空间中查找 made 的声明。没有这样的声明,所以lookup接着进行第二步,即在全局命名空间中由using-directivesi
指定的所有命名空间中形成由限定的lookup找到的所有声明的集合。该集合由 组成,它是名称查找的结果,并通过 using 声明作为名称引入全局命名空间。N::i
我发现值得注意(虽然很明显)这个限定查找的定义是递归的:使用引用中的符号,每个命名空间N i中的限定查找将首先查找直接在N i中进行的声明,然后,如果没有找到, 将依次继续查找由N i中的using 指令指定的命名空间,依此类推。
对于它的价值,MSVC 也接受代码。