匿名命名空间

6

最近在SO上的讨论串引发了这个。

匿名命名空间被认为等同于

  namespace unique { /* empty body */ } 
  using namespace unique; 
  namespace unique { namespace-body }

我记不清为什么它不等同于,确切的原因。
  namespace unique { namespace-body } 
  using namespace unique;

我也尝试过搜索(包括谷歌),但没有结果。请分享您在这方面拥有的任何信息。


4
顺便提一下,技术术语是“未命名命名空间”。 - GManNickG
1个回答

5
现有的规范是在1995年引入的N0783,以纠正一个边角情况。引用该论文(第9页):

The WP defines the semantics of an unnamed namespace as being equivalent to:

namespace UNIQUE {
    // namespace body
}
using namespace UNIQUE;

This is incorrect because it makes the code in an unnamed namespace dependent on whether the code is in an original namespace or a namespace extension.

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

namespace {
    void f()
    {
        using ::f;
    }
}

The WP should be changed to define an unnamed namespace as being equivalent to:

namespace UNIQUE {}
using namespace UNIQUE;
namespace UNIQUE {
    // namespace body
}

其实,我并没有完全理解。这是否意味着所示的代码片段应该在当前标准下是格式良好的? - Chubsdad
是的 - using ::f 遵循了 using namespace UNIQUE。因此,在代码引用 ::f 的地方,UNIQUE::f 被注入到全局命名空间中。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接