c – 名称查找歧义不一致
我试图理解为什么这个程序不会给我一个名字查找歧义:
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标准来解释这种行为吗?我不明白. 解决方法
在第一个程序中使用的变量i是在命名空间P中定义的,因为using指令
using namespace X; 在全局命名空间中放置X的声明(X和P的通用名称).因此,在P中的i声明(更准确地说,由于另一个using指令在Q中)声明了X :: i在全局命名空间中的声明. 来自C标准(3.4.1非限定名称查找)
所以我们有第一个项目 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |