gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:17:47 24 4
gpt4 key购买 nike

如果有一对 .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),因此代码是正确的。

关于c++ - 在 C++ 中,给定命名空间范围的 const float 依赖于全局 const float,它们的初始化顺序是否得到保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53203556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com