为什么一个未命名的名称空间是一个;“高级”;静态的替代方案? 从C++标准中的7.3.1.1/2部分读取:

为什么一个未命名的名称空间是一个;“高级”;静态的替代方案? 从C++标准中的7.3.1.1/2部分读取:,c++,namespaces,standards,iso,C++,Namespaces,Standards,Iso,static关键字的用法是 在中声明对象时已弃用 名称空间范围;未命名的命名空间 提供卓越的选择。 我不明白为什么一个未命名的名称空间被认为是一个更好的选择?理由是什么?我早就知道标准是怎么说的,但我从来没有认真考虑过,即使在回答这个问题时: 它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在我的文章中所描述的那样?或者还有其他原因,我不知道?我问这个问题,特别是因为这是我在回答中的推理,而标准可能还有其他的想法。一个原因可能是静态已经有太多的含义(我至少可以数三个)。由于匿名名称

static关键字的用法是 在中声明对象时已弃用 名称空间范围;未命名的命名空间 提供卓越的选择。

我不明白为什么一个未命名的名称空间被认为是一个更好的选择?理由是什么?我早就知道标准是怎么说的,但我从来没有认真考虑过,即使在回答这个问题时:


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

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

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

    • 我认为有两个原因:

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

      不过需要注意的是,委员会在这一点上后退了:
      static
      n3225

      中不再被标记为不推荐使用,我也想知道这一点。我想这只是因为函数定义不推荐使用static。还有一种方法可以用一个未命名的名称空间来定义本地类。你似乎为另一个问题提供了一个很好的答案。你脑子里到底有什么问题没有回答?@Marcelo Cantos:我编辑了我的问题。:-)或者,如果有什么问题的话,这个问题应该保留,4422507应该结束,因为这里我们看到的是列出的真正原因,而不仅仅是指向标准的指针。请您详细说明第二点好吗?@Nawaz:
      名称空间{typedef int MyType;}
      ?或者委员会删除已弃用的
      注释?+1。此外,C++不允许类型和指针/引用到具有内部链接(静态)的对象或函数作为模板参数。用匿名名称空间替换静态名称空间仍然会对其他翻译单元“隐藏”内容,但它们保留了外部链接(大部分),因此可以用作模板参数。但我想说,匿名名称空间的主要目的可能是为了摆脱静态名称空间的一个重载含义。@sellibitze,非常有趣,在回答中补充了这一点。只有一点需要澄清:你所说的“具有内部链接的类型”是什么意思?难道不是类型不能有内部(静态?)链接的一点吗?这可能是我的错误。我刚刚检查了C++标准草案,它似乎命名类型总是有外部链接。但是内部和外部链接的定义似乎与匿名名称空间的实现有点矛盾。@sellibitze,我对链接的了解有点模糊,但我注意到,
      readelf-s
      在“Bind”列中为静态和匿名名称空间变量输出局部。对于全局变量,它表示为全局变量。但这并不能阻止GCC允许匿名命名空间变量作为模板参数,而不是静态变量,因此您的观点仍然有效。为什么“静态意味着太多东西”这一事实是名称空间优越性的一个很好的原因呢?
      static
      已经有太多的含义(我至少可以数三个)。”我只看到两种不同的含义。@curiousguy:符号链接;局部变量持久性;类方法。我将“持久”变量和静态成员函数视为相同想法的实例:声明在词汇上位于作用域(函数或类)内,但其运行时行为不是该作用域中声明的常见行为。顺便说一句,特定于类的运算符new和delete通常不声明为static,但根据定义始终是static。@curiousguy:存在名称空间static,这意味着全局对象的存储仅限于转换单元。存在成员static,这意味着类的成员不是类实例的一部分(静态成员函数不获取此
      )。还有局部静态,这意味着定义的变量在函数调用中是持久的,但它的生存期只在第一次遇到它时才开始。命名空间静态的生存期从程序执行的开始开始开始,在main之前(就像常规全局变量一样)。不,这是3个定义。@Nicolas没错,有3个定义不能完全统一,但最后两个是相关的。静态的
      只有两种完全不相关的用法:“仅限于翻译单元”和“非正常的生存期规则”。