在查找命名空间名称的过程中,可以考虑与命名空间名称不同的其他名称

What other names could be considered during the lookup for a namespace-name, different than namespace names?

本文关键字:命名空间 其他 查找 过程中      更新时间:2023-10-16

§3.4.6/1:

using指令命名空间别名定义中查找命名空间名称嵌套名称说明符只考虑命名空间名称。

基本上,我要问的是:"为什么这段话是必要的?"

缺陷报告373:在using指令中查找命名空间限定名称提供了一个措辞重要的示例:

namespace X {
  namespace Y {
    struct X {
      void f()
      {
        using namespace X::Y;
        namespace Z = X::Y;
      }
    };
  }
}

哪个Xusing namespace X::Y中被引用为结构或命名空间?如果3.4.6中没有这一措辞,它将是模棱两可的。

这实际上导致了措辞的变化:

在using指令或命名空间别名定义中查找命名空间名称时,只考虑命名空间名称。

到今天为止,因为最初的措辞没有涵盖嵌套名称说明符

歧义在于嵌套名称说明符,如果我们查看C++11标准草案,5.1.1常规部分中的语法如下:

nested-name-specifier:
    ::opt type-name ::
    ::opt namespace-name ::
    decltype-specifier ::
    nested-name-specifier identifier ::
    nested-name-specifier templateopt simple-template-id ::

以下段落我不会复制,因为它们很大,不会将嵌套名称说明符限制为命名空间

据我所知,7.3.1命名空间定义充分限制名称空间名称以防止歧义。

Clang针对namespace usingalias directives的单元测试正是您问题的答案:

clang cc-仅限fsyntax-验证%s

struct ns1 {}; // This is not a namespace, although a namespace has ns1 as a name
void ns2();
int ns3 = 0;
namespace ns0 {
  namespace ns1 {
    struct test0 {};
  }
  namespace ns2 {
    struct test1 {};
  }
  namespace ns3 {
    struct test2 {};
  }
}
using namespace ns0;
namespace test3 = ns1; // don't get confused
namespace test4 = ns2;
namespace test5 = ns3;
using namespace ns1; // don't get confused
using namespace ns2;
using namespace ns3;
test0 a;
test1 b;
test2 c;

n3160缺陷报告中也讨论了这个问题