名称查找歧义不一致

Name-lookup ambiguity inconsistency

本文关键字:不一致 歧义 查找      更新时间:2023-10-16

我试图理解为什么这个程序没有为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种不同的编译器:

  • GCC和Clang with http://melpon.org/wandbox
  • visual c++ with http://webcompiler.cloudapp.net/

都给出了这封邮件中所述的结果,我正试图找出原因。

有人能用c++标准来解释这种行为吗?我不明白。

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

using namespace X;

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

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

2由using指令指定的命名空间中的声明在包含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;