为什么一个未命名的命名空间是静态的"优越"替代品?

Naw*_*waz 86 c++ standards iso namespaces

C++标准中的$ 7.3.1.1/2节描述如下:

在声明命名空间作用域中的对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择.

我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?我已经知道标准的内容很长一段时间,但我从未认真考虑过,即使我回答这个问题:未命名的命名空间优于静态?

它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在回答中所描述的那样?还是有其他原因,我不知道?我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素.

Ser*_*nov 93

  • 正如您所提到的,命名空间适用于任何事物,而不仅仅适用于函数和对象.
  • 正如格雷格指出的那样,已经有static太多的东西了.
  • 命名空间提供统一且一致的方式来控制全局范围内的可见性.您不必为同一件事使用不同的工具.
  • 当使用匿名命名空间时,函数/对象名称将被正确地破坏,这允许您在去除变形后在符号表中看到类似"(anonymous namespace):: xyz"的内容,而不仅仅是带有静态链接的"xyz" .
  • 正如下面的评论中所指出的,不允许使用静态事物作为模板参数,而使用匿名命名空间则没有问题.
  • 更多?可能,但我现在想不出任何其他事情.

  • +1.此外,C++不允许将类型和指针/引用与具有内部链接(静态)的对象或函数用作模板参数.用匿名命名空间替换静态仍然"隐藏"来自其他翻译单元的东西,但它们保持外部链接(大多数),因此可以用作模板参数.但我要说匿名命名空间的主要目的可能是摆脱静态的一个重载含义. (15认同)

Gre*_*ill 9

一个原因可能是static已经有太多的含义(我可以算至少三个).由于匿名命名空间可以封装包括类型在内的任何内容,因此它似乎优于static解决方案.

  • @curiousguy:符号链接; 局部变量持久性; 类方法. (9认同)
  • @NicolBolas 没错,有 3 个定义不能完全统一,但最后两个是相关的。`static` 只有两种完全不相关的用法:“_restricted to the translation unit_”和“not the normal life规则”。 (3认同)
  • @curiousguy:这里有静态名称空间,这意味着全局对象的存储仅限于转换单元。有成员静态的,这意味着该类的成员不是该类实例的一部分(并且静态成员函数不会获得“ this”)。并且有local-static,这意味着定义的变量在函数调用之间是持久的,但是* lifetime *仅在第一次遇到它时才开始。静态名称空间的生存期从程序执行的开始开始,直到main为止(就像常规的全局变量一样)。所以不,这是3个定义。 (2认同)

Mat*_* M. 7

我认为有两个原因:

  • static 有两个不同的含义:在类范围,它意味着由整个类共享,而在文件/功能范围它影响可见性/存储...
  • 未命名的命名空间允许声明new struct,classtypedef

但需要注意的是,委员会对此进行了后退:static不再标记为已弃用n3225.