我在下面尝试了这个虚拟代码来测试未命名的命名空间.
我有以下输出
ctor 1
ctor 0
3
5
Run Code Online (Sandbox Code Playgroud)
我对此有点困惑.
a::m_a.相反,它总是指较少的嵌套.总是这样吗?C++遵循什么规则?m_a从main()?获取最嵌套的变量?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)
我没有 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 指令的唯一命名的命名空间。