具有未命名命名空间的名称空间,声明了相同的变量

Abr*_*ile 7 c++ namespaces

我在下面尝试了这个虚拟代码来测试未命名的命名空间.

我有以下输出

 ctor 1
 ctor 0
 3
 5
Run Code Online (Sandbox Code Playgroud)

我对此有点困惑.

  1. 我期待编译器的错误,说它无法解决关于的歧义a::m_a.相反,它总是指较少的嵌套.总是这样吗?C++遵循什么规则?
  2. 似乎编译器按照写在文件上的顺序创建变量CMyObj.总是这样吗?
  3. 有没有办法m_amain()?获取最嵌套的变量?
class CMyObj{     
    public:
    CMyObj(int a){std::cout  << "ctor " << a << std::endl; }
 };
 namespace a{ 
      namespace{
           int m_a=4;
           int m_b=5;
           CMyObj m_obj(1);
      }  
 }
 namespace a{
      int m_a=3;
      CMyObj m_obj(0);
 }
 int main(){
      std::cout << a::m_a << std::endl; // which one?
      std::cout << a::m_b << std::endl; // how this is possible?
      return 0;
 }
Run Code Online (Sandbox Code Playgroud)

Gen*_*yev 3

我没有 C++03 标准来检查那里的措辞,所以我将引用 FDIS n3290 中的内容。我认为这个问题的答案可以在 3.4.3.2/2 中的限定名称查找规则中找到:

对于命名空间 X 和名称 m,命名空间限定查找集 S(X,m) 定义如下:令 S0(X,m) 为 X 中 m 的所有声明和 X 的内联命名空间集 ( 7.3.1)。若S0(X,m)不为空,则S(X,m)为S0(X,m);否则,S(X,m) 是 X 及其内联命名空间集中使用指令指定的所有命名空间 Ni 的 S(Ni,m) 的并集。

现在,请记住,未命名的命名空间是带有 using 指令的唯一命名的命名空间。