名称查找歧义不一致

Name-lookup ambiguity inconsistency

我试图理解为什么这个程序没有为 i:

提供名称查找歧义
namespace X { int i = 1; }

namespace Q {    
    namespace P {        
        int i = 2;
        using namespace X;
    }

    using namespace P;

    int l = i;
}

int main() {}

如果我们像这样修改它,我们会得到名称查找歧义:

namespace X { int i = 1; }

namespace P {        
    int i = 2;
    using namespace X;
}

using namespace P;

int l = i;

int main() {}

我在这里所做的唯一更改是删除命名空间 Q,并将其内容放在全局命名空间中。

我试过 3 种不同的编译器:

他们都给出了这封电子邮件中所述的结果,我正在尝试找出原因。

任何人都可以根据 c++ 标准解释这种行为吗?看不懂。

在第一个程序中使用的变量 i 是在命名空间 P 中定义的,因为 using 指令 ​​

using namespace X;

在全局命名空间(X 和 P 的通用命名空间)中放置 X 的声明。因此,P 中 i 的声明(由于另一个 using 指令,在 Q 中更准确)隐藏了全局命名空间中 X::i 的声明。

来自 C++ 标准(3.4.1 非限定名称查找)

2 The declarations from the namespace nominated by a using-directive become visible in a namespace enclosing the using-directive; see 7.3.4.

所以我们有第一个节目

namespace X { int i = 1; }

namespace Q {    
    namespace P {        
        int i = 2;
        using namespace X; // 1
    }

    using namespace P; // 2

    int l = i;
}

using 指令 ​​#1 的封闭命名空间是全局命名空间,using 指令 ​​#2 的封闭命名空间是命名空间 Q。

在第二个程序中,由于这两个 using 指令

i 的两个定义都放在全局命名空间中
//...
using namespace X;
//...
using namespace P;