c++ - 在查找 namespace 名称期间可以考虑哪些其他名称,而不是 namespace 名称?

标签 c++ c++11 namespaces language-lawyer name-lookup

§3.4.6/1:

In a using-directive or namespace-alias-definition, during the lookup for a namespace-name or for a name in a nested-name-specifier only namespace names are considered.

基本上,我要问的是:“为什么这一段是必要的?”

最佳答案

Defect report 373: Lookup on namespace qualified name in using-directive举例说明为什么措辞很重要:

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

using namespace X::Y 结构或命名空间中引用了哪个 X?如果 3.4.6 中没有这样的措辞,就会产生歧义。

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

When looking up a namespace-name in a using-directive or namespace-alias-definition, only namespace names are considered.

我们今天所拥有的,因为原始措辞没有涵盖嵌套名称说明符

歧义在于 nested-name-specifier 如果我们查看 draft C++11 standard 5.1.1 General 部分的语法如下:

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

以及以下我不会复制的段落,因为它们很大,不会将nested-name-specifier 限制为 namespace

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

关于c++ - 在查找 namespace 名称期间可以考虑哪些其他名称,而不是 namespace 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058966/

相关文章:

c++ - 如何让循环重复输入的行数?

c++ - 如何从就地临时变量初始化非静态私有(private)模板成员变量,即不进行复制或移动?

database - 架构名称与表名称 - 如何避免冲突?

C++ namespace 混淆 - std::vs::vs 调用 tolower 时没有前缀?

c# - 将自定义代码放在系统 namespace 中

c++ - C++ 中纯虚拟容器接口(interface)的迭代器

c++ - WASAPI 在 Windows 上捕获的缓冲区大小

C++ Stack 实现意外输出

c++ - 如何在类中初始化 C++11 native 指针和数组?

c++ - 检查默认删除的函数模板是否明确专门用于特定类型?