1

如果有一对 .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;
}

在其中,是否保证在ge之后初始化upperLimit

我知道来自不同翻译单元的全局对象的不确定初始化顺序。我想确定混合全局对象和名称空间范围对象的情况是否属实。

4

1 回答 1

3

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

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

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

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

于 2018-11-08T08:17:15.450 回答