c++ - 声明 `using namespace C;` 对于证明 [namespace.udir]/3 中示例中显示的结果至关重要

标签 c++ language-lawyer

据我所知,using namespace C; 下面在 namespace D 中的声明对于编译器提示歧义是必要的 qualified-ids B::C::iA::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/

相关文章:

c++ - 通过 read 函数而不是 fread 读取标准输出

c++ - 增加 Virtual Bytes 的操作和函数

c++ - 定义变量与即时计算

c++ - 如何确定key的 "(default)"值

c++ - 数组元素是不完整的对象吗?

c++ - 为什么 "0xe+1"无法编译?

c++ - 澄清指向非静态类成员的指针

c++ - 如何为我的应用程序禁用 UAC

c++ - 是否未指定标准库头文件是否包含任意头文件?

c++ - 构造函数初始化列表中的 'this'指针