是否将名称空间范围的文件本地 (.cpp) 常量放置在匿名名称空间中

Placing a namespace-scope file-local (.cpp) constant in an anonymous namespace or not

在名称空间范围内声明的(文件本地;.cpp)const 限定变量具有内部链接,因此是本地翻译单元。是否有任何理由 to/effect 仍将常量包装在匿名名称空间中?

例如,是否有任何理由比其他两个更喜欢以下两个,如果是,为什么?

// file.cpp
namespace foo {

const int kMyLocalConstant = 42;  // internal linkage

}  // namespace foo

// file.cpp
namespace foo {
namespace {

const int kMyLocalConstant = 42;  // internal linkage

}  // namespace
}  // namespace foo

我很高兴能得到 C++03 和 C++11 的答案,如果两者之间在这个上下文中有任何不同的话。


可能重复

我已经阅读了

的优秀答案

但我没有看到它回答我的具体问题(如果我错了请纠正我),因为答案集中在非常量变量标识符和非静态自由函数上。我的问题集中在文件本地名称空间范围内的常量,即已经具有内部链接的变量标识符。也许有一个我还没有找到更合适的骗局。

未命名的命名空间是多余的,在这种情况下使用它没有任何好处。

我将 const 放入未命名命名空间的唯一情况是当存在其他内容(函数等)时,它们也应该具有内部链接,并且 const 和其他东西是连贯的。

非常喜欢未命名的命名空间。

为什么?因为它使规则非常容易记住:如果我正在创建一个 variable/function/template 打算在翻译单元本地使用,我将它无条件地放在一个未命名的名称空间中,然后我就不必又担心什么了。

确实 a non-inline variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage 也将具有内部链接,但是您真的要选择将非常量变量放在未命名的名称空间中,而将常量变量放在一个名称空间之外吗?如果您不小心忘记了 const:

,这将很容易出错
// some_tu.cpp
namespace foo {
    int oops = 42;
}

你会混搭吗?这很奇怪:

// some_other_tu.cpp
namespace foo {
    const int a = 0;
    namespace {
        int b;
    }
}

未命名的命名空间是免费的 - 唯一的成本是输入它所需的字符。这意味着没有人必须盯着这段代码并回忆起 [basic.link] 规则的所有微妙之处。