为什么未命名的命名空间不等同于带有“using命名空间”声明的常规命名空间?

Chu*_*dad 6 c++ namespaces using-declaration language-lawyer unnamed-namespace

SO最近的一个帖子触发了这一点。

未命名的命名空间被认为等同于

  namespace unique { /* empty body */ } 
  using namespace unique; 
  namespace unique { namespace-body }
Run Code Online (Sandbox Code Playgroud)

我记不起它不等于的确切原因

  namespace unique { namespace-body } 
  using namespace unique;
Run Code Online (Sandbox Code Playgroud)

也尝试过搜索(包括谷歌)但没有成功。请分享您在这方面掌握的任何信息。

Jam*_*lis 5

现在存在的规范于 1995 年在N0783中引入,以纠正极端情况。引用该论文(第 9 页):

WP 将未命名命名空间的语义定义为等效于:

namespace UNIQUE {
    // namespace body
}
using namespace UNIQUE;
Run Code Online (Sandbox Code Playgroud)

这是不正确的,因为它使得未命名命名空间中的代码取决于代码是位于原始命名空间还是命名空间扩展中。

namespace {} // If you remove this line, the
             // use of ::f below is invalid

namespace {
    void f()
    {
        using ::f;
    }
}
Run Code Online (Sandbox Code Playgroud)

WP 应该更改为定义一个未命名的命名空间,相当于:

namespace UNIQUE {}
using namespace UNIQUE;
namespace UNIQUE {
    // namespace body
}
Run Code Online (Sandbox Code Playgroud)