2011-06-29 58 views
2

以下是統計對象的簡單情況:它在全局空間中的靜態變量之前聲明類的對象是否定義良好?

struct A 
{ 
    static int count; 
    A() { ++ count; } 
}; 

現在,它的對象和static成員被聲明爲:

A obj; // comes 1st 
int A::count = 5; // comes 2nd 

g++ produces expected result。但是,因爲A::count的定義出現在全局空間中的A實例之一之後,所以不應該是未定義的行爲

+0

POD是零初始化的。靜態的前向聲明確實應該是前向的,但它可能取決於聲明A的範圍是全局範圍,命名空間等在事物初始化方面有重大差異。 – AJG85

回答

2

這取決於。

3.6.2

用於與靜態 存儲持續時間(basic.stc.static)對象存儲 應爲零初始化(dcl.init) 任何其它初始化之前需要 地方。零初始化和 初始化與常數 表達式統稱爲 靜態初始化;其他所有 初始化都是動態的 初始化。 POD類型的對象 (basic.types)帶有靜態存儲 持續時間初始化爲常量 表達式(expr.const)應爲 在任何動態初始化發生前初始化 。

由於您有一個用常量表達式初始化的POD,它將被靜態初始化,即在任何構造函數運行之前。更改任何這些條件,並且可能會發生意外的結果。

+1

結果可能是意想不到的,但即使沒有經常進行初始化,它們仍然可以很好地定義。 –

相關問題