为什么未命名命名空间是静态命名空间的“高级”替代品? [重复]

问题描述 投票:0回答:3

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

static关键字的使用是 在 a 中声明对象时已弃用 命名空间范围;未命名的命名空间 提供了一个更好的选择。

我不明白为什么未命名的命名空间被认为是更好的选择?理由是什么?我很早就知道标准的内容,但我从未认真思考过它,即使在回答这个问题时也是如此:未命名命名空间相对于静态的优越性?

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

c++ namespaces language-lawyer
3个回答
126
投票
  • 正如您所提到的,命名空间适用于任何事物,而不仅仅是函数和对象。
  • 正如格雷格所指出的,
    static
    已经意味着太多的事情了。
  • 命名空间提供了一种统一且一致的方式来控制全局范围内的可见性。您不必使用不同的工具来完成同一件事。
  • 当使用匿名命名空间时,函数/对象名称将被正确地破坏,这使您可以在破坏后在符号表中看到类似“(匿名命名空间)::xyz”的内容,而不仅仅是静态的“xyz”联动。
  • 正如下面的评论所指出的,不允许使用静态事物作为模板参数,而使用匿名名称空间则可以。
  • 更多?可能吧,但我现在想不出其他的了。

11
投票

原因之一可能是

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


6
投票

我认为有两个原因:

  • static
    有两种不同的含义:在类范围内,它意味着由整个类共享,而在文件/函数范围内,它会影响可见性/存储...
  • 未命名的命名空间允许声明新的
    struct
    class
    typedef

但需要注意的是,委员会对此反悔了:

static
不再在
n3225
中标记为已弃用。

© www.soinside.com 2019 - 2024. All rights reserved.