据我所知,using namespace C;
下面在 namespace D
中的声明对于编译器提示歧义是必要的 qualified-ids B::C::i
和 A::i
在下面的代码中,这是一个例子[namespace.udir]/3 中的 C++ 标准:
namespace A {
int i;
namespace B {
namespace C {
int i;
}
using namespace A::B::C;
void f1() {
i = 5; // OK, C::i visible in B and hides A::i
}
}
namespace D {
using namespace B;
//using namespace C;
void f2() {
i = 5; // ambiguous, B::C::i or A::i?
}
}
void f3() {
i = 5; // uses A::i
}
}
void f4() {
i = 5; // ill-formed; neither i is visible
}
令人惊讶的是,所有三个编译器 VS2017、GCC 和 clang当声明 using namespace C;
从代码中注释掉时,显示相同的错误消息。我错过了什么?
main.cpp:17:13: error: reference to 'i' is ambiguous i = 5; // ambiguous, B::C::i or A::i?
最佳答案
歧义是由于较早的 using 指令:
namespace B {
// ...
using namespace A::B::C;
// ...
}
namespace D {
using namespace B;
因为 using 指令对于非限定查找是可传递的 ([namespace.udir]/4)。
关于c++ - 声明 `using namespace C;` 对于证明 [namespace.udir]/3 中示例中显示的结果至关重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51189750/