为什么一个无名的命名空间是静态的“优越”select?

C ++标准中的$ 7.3.1.1 / 2节读取:

在名称空间范围内声明对象时,不推荐使用static关键字; 无名命名空间提供了一个优越的select。

我不明白为什么一个无名的命名空间被认为是一个优越的select? 基本原理是什么? 我已经知道标准所说的很长一段时间了,但是我从来没有认真考虑过这个问题,即使我回答了这个问题: 无名的命名空间比静态的优越性?

它被认为是优越的,因为它也可以应用于用户定义的types,正如我在我的答案中所述 ? 或者还有其他一些原因,我不知道? 我在问这个问题,特别是因为这是我的答案,而标准可能还有别的想法。

  • 正如你所提到的,名称空间适用于任何事物,而不仅仅是函数和对象。
  • 正如Greg指出的那样, static意味着已经有太多东西了。
  • 命名空间在全局范围内提供统一和一致的控制可见性的方法。 你不必为同一件事情使用不同的工具。
  • 当使用匿名名称空间时,函数/对象名称会被正确地修改,这样可以在解除绑定之后在符号表中看到类似“(匿名命名空间):xyz”的东西,而不仅仅是具有静态链接的“xyz” 。
  • 正如在下面的评论中所指出的那样,不允许使用静态的东西作为模板参数,而使用匿名命名空间就没有问题。
  • 更多? 也许吧,但现在我想不出其他什么了。

一个原因可能是static已经有太多的意义(我可以算作至less三个)。 由于匿名名称空间可以封装任何types,所以它似乎优于static解决scheme。

我认为有两个原因:

  • static有两个不同的含义:在类作用域,这意味着全class共享,而在文件/function范围,它影响的可见性/存储…
  • 未命名的命名空间允许声明新的structclasstypedef

值得注意的是, n3225表示反对: staticn3225不再被标记为废弃。

无论他们有什么原因,他们改变了主意: http : //crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/