在 C++ 中,给定命名空间范围的 const float 依赖于全局 const float,它们的初始化顺序是否得到保证?

In C++, given namespace-wide const float dependant on a global const float, is their initialization order guaranteed?

如果有一对 .h/.cpp 文件分别带有类似的内容,

extern const float ge;

const float ge = 2.2f;

在其中,另一个 .cpp 文件包含

namespace {
const float upperLimit = 2.0f * ge;
} // namespace

bool foo(float a)
{
    return a < upperLimit;
}

里面是不是保证upperLimitge之后初始化?

我知道来自不同翻译单元的全局对象的不确定初始化顺序。我想确定它是否适用于混合全局和命名空间范围的对象。

在您的代码中,ge 保证在 upperLimit 之前初始化,但这与命名空间无关。如果您没有命名空间,情况也是一样的。命名空间对初始化顺序没有影响。

代码const float ge = 2.2f;constant initialization的一部分,是静态初始化的一部分,因为它是一个静态存储持续时间被初始化的变量常量表达式。

然而,在代码 const float upperLimit = 2.0f * ge; 中,初始值设定项不是常量表达式,因为 ge 的值未知。所以它不是静态初始化(因此属于动态初始化)。

所有静态初始化强烈发生在动态初始化 (C++17 [basic.start.static]/2) 之前,因此代码是正确的。