名称查找歧义不一致
Name-lookup ambiguity inconsistency
我试图理解为什么这个程序没有为 i:
提供名称查找歧义
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
- Visual C++ 与 http://webcompiler.cloudapp.net/
他们都给出了这封电子邮件中所述的结果,我正在尝试找出原因。
任何人都可以根据 c++ 标准解释这种行为吗?看不懂。
在第一个程序中使用的变量 i
是在命名空间 P 中定义的,因为 using 指令
using namespace X;
在全局命名空间(X 和 P 的通用命名空间)中放置 X 的声明。因此,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;
}
using 指令 #1 的封闭命名空间是全局命名空间,using 指令 #2 的封闭命名空间是命名空间 Q。
在第二个程序中,由于这两个 using 指令
,i
的两个定义都放在全局命名空间中
//...
using namespace X;
//...
using namespace P;
我试图理解为什么这个程序没有为 i:
提供名称查找歧义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
- Visual C++ 与 http://webcompiler.cloudapp.net/
他们都给出了这封电子邮件中所述的结果,我正在尝试找出原因。
任何人都可以根据 c++ 标准解释这种行为吗?看不懂。
在第一个程序中使用的变量 i
是在命名空间 P 中定义的,因为 using 指令
using namespace X;
在全局命名空间(X 和 P 的通用命名空间)中放置 X 的声明。因此,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;
}
using 指令 #1 的封闭命名空间是全局命名空间,using 指令 #2 的封闭命名空间是命名空间 Q。
在第二个程序中,由于这两个 using 指令
,i
的两个定义都放在全局命名空间中
//...
using namespace X;
//...
using namespace P;