2016-07-15 181 views
1

考慮靜態變量會經歷多個初始化嗎?

//#include stuff 
const int x=5; 
. 
. 
int main() 
{ 
static int var=x; 
. 
. 
} 

如果我理解正確的話,

  • 靜態變量初始化爲零的任何初始化是否被指示,所以static int var;僅此一項就設置var零和static int var=x;也要設置varzero
  • 現在static int var=x;執行常量表達式初始化,IIRC在零初始化後完成。

是靜態變量initialized multiple times - 雖然該短語自相矛盾?

+0

不確定你的問題到底是什麼。你描述了發生了什麼:在概念上,'x'設置爲'0',然後'5'。打電話給你將會怎麼樣 –

+0

@ M.M:我明白了,謝謝你,有沒有使用這樣的實現? – sjsam

+0

你是什麼意思? –

回答

4

C++ 14點的狀態:

3.6.2初始化非局部變量

的...

變量具有靜態存儲的持續時間(3.7.1)或線程存儲 在任何其他初始化發生之前,持續時間(3.7.2)應該被初始化(8.5) 。

好的,這似乎是這個問題的基礎。進行

常量初始化:

[...]

這之後是恆定的初始化的定義。長話短說,const int x=5;static int var=x;似乎滿足不斷初始化的要求。

因此,基於此,這似乎表明「靜態變量[是]多次初始化」。

奮進:

總之,零初始化和常數初始化被稱爲 靜態初始化;所有其他初始化都是動態的 初始化。在動態初始化發生之前,應執行靜態初始化。

所以,無論是零初始化和常數初始化,「多」初始化是主題在這裏,必須動態初始化之前發生。因此,我的結論是,雖然在技術上,「靜態變量被多次初始化」的說法是真實的,但我沒有看到任何實際觀察它的方法。您需要動態初始化來觀察某些內容。在靜態初始化完成之前,動態初始化不會發生。

由此看來,在3.6.2中定義的術語「靜態初始化」與「靜態初始化失敗」中的靜態初始化不同。在我看來,「靜態初始化失敗」實際上應該被稱爲「動態初始化失敗」。

+0

Thankyou Sam。很好的解釋@ sam-varshavchik – sjsam