簡體   English   中英

在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; 常量初始化的一部分,它是靜態初始化的一部分,因為它是一個變量,靜態存儲持續時間由常量表達式初始化。

但是,在代碼const float upperLimit = 2.0f * ge; ,初始化程序不是常量表達式,因為ge的值是未知的。 所以它不是靜態初始化(因此屬於動態初始化 )。

所有靜態初始化都強烈發生在動態初始化之前(C ++ 17 [basic.start.static] / 2),因此代碼是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM