匿名名称空间中的对象是否隐式静态?

时间:2012-11-15 11:37:47

标签: c++ c++11

从C ++ 11标准的角度来看,对象状态/属性之间存在技术差异:

namespace
{
   int foo;
   const int bar = 42;
}

namespace
{
   static int foo;
   static const bar = 42;
}


从这里的问题和答案我相信匿名命名空间中的对象是隐式静态的,但是有人告诉我它只是内部的链接,编译器不会将对象视为静态标记,如同它的含义将实施对象构建。所以我需要一些关于它真正含义的细节,如果匿名命名空间中有和没有静态之间存在差异。

2 个答案:

答案 0 :(得分:30)

C ++ 11,3.5 / 4:

  

直接或间接声明的未命名命名空间或命名空间   在未命名的命名空间内有内部链接。所有其他名称空间   有外部联系。具有未命名的命名空间范围的名称   上面给出的内部连接具有与封闭相同的连接   名称空间,如果它是 - 变量...

的名称

所以在C ++ 11中,你的foo个对象都有内部链接。在C ++ 03中,第一个有外部链接。

无论链接如何,它都有静态存储持续时间。

我认为标准中没有任何“将对象视为静态标记”,所以我无法回答这个问题。如果您在标准中发现某些文本引用该对象是否“标记为静态”并且没有具体指向链接或存储持续时间,那么请引用它并且我可以给您一个意见: - )

答案 1 :(得分:1)

有一个很大的区别:static,名称有内部联系;没有它,它有外部链接(但是在名称空间中,你可以在另一个翻译单元中引用)。差异并不总是重要的,但在某些情况下确实会发挥作用:例如,如果您的模板带有int*参数,则无法在&foo foo上实例化{ {1}}被声明为static

编辑:

正如Steve Jessop指出的那样,这只适用于C ++ 03。 C ++ 11确实在这里进行了更改。虽然我不知道为什么;我发现C ++ 03规范更加连贯 - 命名空间不应该影响链接。