c – 名称查找歧义不一致

c – 名称查找歧义不一致,第1张

概述我试图理解为什么这个程序不会给我一个名字查找歧义: namespace X { int i = 1; }namespace Q { namespace P { int i = 2; using namespace X; } using namespace P; int l = i;}int mai 我试图理解为什么这个程序不会给我一个名字查找歧义:

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与http://melpon.org/wandbox
>视觉c与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 The declarations from the namespace nominated by a using-directive
become visible in a namespace enclosing the using-directive; see
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;
总结

以上是内存溢出为你收集整理的c – 名称查找歧义不一致全部内容,希望文章能够帮你解决c – 名称查找歧义不一致所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存