4

在草案 §7.3.1¶1 (n4527) 中,命名空间定义的语法包含:

封闭命名空间说明符:

标识符

封闭命名空间说明符 :: 标识符

这可以防止命名空间定义具有以“::”开头的标识符

namespace d{ namespace e {} }
namespace ::d::e
{
void foo(){}
}

这种限制有什么理由吗?


更新: downvote(s) 和一些答案让我意识到当我在第一句话中的意思是“草稿”时,我写了“标准”。在我的辩护中,我确实在括号中写了文件编号。因此,让我强调这是一个关于 C++1z 的嵌套命名空间定义特性的问题。

4

2 回答 2

0

下面的两种用法A::有很大不同:

void f();
namespace A {
  void f();
  namespace B {
    void f();
    void g() {
      A::f();      // #1
      ::f();
    }
  }
}
namespace A::N {}  // #2
namespace /*::*/N {}
  1. 这将选择一个命名空间,以避免B::f通过不合格的查找找到。此用例也适用于全局命名空间,因此需要::f;.
  2. 将建立(即创建或重新打开)一个命名空间。这个用例显然不适用于全局命名空间,因此没有理由::N在最后一行中允许。
于 2017-09-18T05:27:28.977 回答
0

以 开头的行::向编译器表明您希望使用全局命名空间。例如:

void foo()
{
  std::cout << "1" << std::endl;
}

namespace d
{
  void foo()
  {
    std::cout << "2" << std::endl;
  }

  void example()
  {
    foo();
    ::foo();
  }
}

此代码将打印出来:

2
1

当第一个调用转到全局命名空间中d::foo()的第二个调用时。foo()因此,当您尝试为其创建名称空间时,将 a::放在名称空间的开头会使您看起来像是在放入d全局名称空间,这实际上没有任何意义。

于 2015-11-10T15:15:09.400 回答