名称查找歧义不一致

时间:2015-07-18 11:29:56

标签: c++ language-lawyer using-directives name-lookup

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

1 个答案:

答案 0 :(得分:1)

在第一个程序中,变量i在名称空间P中定义,因为using指令

using namespace X;

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

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

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