名称查找歧义不一致

至上

我试图了解为什么该程序没有为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中,因为变量using是在命名空间P中定义的,使用过的变量已定义

using namespace X;

将X的声明放置在全局名称空间(X和P的通用名称空间)中。因此i,P中的声明(由于另一个using指令,更确切地说是Q中的声明)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;
}

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

在第二个程序i中,由于这两个using指令,它们的两个定义都放置在全局名称空间中

//...
using namespace X;
//...
using namespace P;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章