c++ - 为什么未命名的命名空间是静态的 "superior"替代品?

标签 c++ namespaces standards iso

C++ 标准中的 $7.3.1.1/2 部分内容如下:

The use of the static keyword is deprecated when declaring objects in a namespace scope; the unnamed-namespace provides a superior alternative.

我不明白为什么一个未命名的命名空间被认为是更好的选择?理由是什么?我很早就知道标准的内容,但我从未认真考虑过,即使我在回答这个问题时也是如此:Superiority of unnamed namespace over static?

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

最佳答案

  • 正如您所提到的,命名空间适用于任何事物,而不仅仅是函数和对象。
  • 正如 Greg 所指出的,static 已经意味着太多东西了。
  • 命名空间提供了一种统一且一致的方式来控制全局范围内的可见性。您不必为同一件事使用不同的工具。
  • 当使用匿名命名空间时,函数/对象名称会被正确地修饰,这使您可以在去修饰后在符号表中看到类似“(anonymous namespace)::xyz”的内容,而不仅仅是“xyz”带有静态链接。
  • 正如下面评论中所指出的,不允许使用静态的东西作为模板参数,而使用匿名命名空间就可以了。
  • 更多?可能,但我现在想不出别的。

关于c++ - 为什么未命名的命名空间是静态的 "superior"替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4977252/

相关文章:

c++ - 调整动态数组大小后可能出现的问题

c++ - 我的多晶型符合标准吗?

c++ - 如何使编译器仅搜索包含目录中的特定文件并排除该特定目录中的其余文件

c++ - 如何用代码初始化静态成员char数组

clojure - 创建另一个 Clojure 命名空间的别名

file - 在其他命名空间中应用宏

matlab - 我可以在不在每个函数中显式调用 import 的情况下全局导入命名空间吗?

c++ - C++中有符号到无符号的转换

javascript - 为什么 JS 计算属性语法允许赋值表达式?

c++ - 为什么 `ranges::view::for_each` 要求仿函数必须返回 `InputRange` 概念的模型?