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

c – 具有未命名命名空间的名称空间,声明了相同的变量,第1张

概述我在下面尝试了这个虚拟代码来测试未命名的命名空间. 我有以下输出 ctor 1 ctor 0 3 5 我对此有点困惑. >我期待编译器发出错误,说它无法解决 关于:: m_a的歧义.相反,它始终指的是 少嵌套.总是这样吗? C遵循什么规则? >似乎编译器按顺序创建变量CMyObj 写在文件上.总是这样吗? >有没有办法访问最嵌套的m_a变量 来自main()? class CMyObj{ 我在下面尝试了这个虚拟代码来测试未命名的命名空间.

我有以下输出

ctor 1 ctor 0 3 5

我对此有点困惑.

>我期待编译器发出错误,说它无法解决
关于:: m_a的歧义.相反,它始终指的是
少嵌套.总是这样吗? C遵循什么规则?
>似乎编译器按顺序创建变量CMyObj
写在文件上.总是这样吗?
>有没有办法访问最嵌套的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; }
解决方法 我没有C 03标准来检查那里的措辞,所以我将引用Fdis n3290.我认为这个问题的答案可以在3.4.3.2/2中的限定名称查找规则中找到:

For a namespace X and name m,the namespace-qualifIEd lookup set S(X,m) is defined as follows: Let S0(X,m) be the set of all declarations of m in X and the inline namespace set of X (7.3.1). If S0(X,m) is not empty,S(X,m) is S0(X,m); otherwise,m) is the union of S(Ni,m) for all namespaces Ni nominated by using-directives in X and its inline namespace set.

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

总结

以上是内存溢出为你收集整理的c – 具有未命名命名空间的名称空间,声明了相同的变量全部内容,希望文章能够帮你解决c – 具有未命名命名空间的名称空间,声明了相同的变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241293.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存