4

我试图理解为什么这个程序没有为 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++ 标准来解释这种行为吗?我无法理解它。

4

1 回答 1

1

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

using namespace X;

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

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

2 来自 using-directive 指定的命名空间的声明在包含 using-directive 的命名空间中变得可见;见 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 的封闭命名空间是 namepsace Q。

在第二个程序中,i由于这两个 using 指令,这两个定义都放在了全局命名空间中

//...
using namespace X;
//...
using namespace P;
于 2015-07-18T12:03:13.243 回答