在同一個編譯單元中,C++標準指出靜態初始化順序已被很好地定義 - 它是靜態對象聲明的順序。但是使用Sun Studio 12編譯器時遇到了直覺行爲。我已經定義了一個模板類helper<T>
,其中包含T
類型的靜態成員_data
以及使用_data
(調用foo
)的靜態成員函數。在我的.cpp文件我有這個上面的main():模板的typedefs是否保存靜態初始化順序?
struct A { /* some definition */ };
typedef helper<int> s0;
typedef helper<A> s1;
注意,對於helper<int>
typedef的自帶之前爲helper<A>
typedef的。因此根據標準,我預計helper<int>::_data
將在helper<A>::_data
之前構建(記住_data
是一個靜態成員)。在GCC上就是這樣,在Sun上它不是。
這是有問題的,因爲A的構造函數使用helper<int>::_data
。我只有一個編譯單元,沒有更早的helper<A>
潛在實例,所以我認爲應該定義好順序。這是Sun編譯器的bug,還是typedef在技術上不構成定義/實例?我的意思是,標準允許Sun編譯器的行爲?
我主要有如下():
int main()
{
//Swapping the order of these has no effect on Sun
s0::foo();
s1::foo();
}
有的S0或S1沒有其他用途。
從我的理解代碼*不*聲明對象。幫手有一個靜態數據成員。所以每當模板被實例化時,都會創建一個靜態數據成員(一個對象)。 typedef實例化模板....對吧? –
2009-07-10 16:03:37
typedef沒有實例化模板。 – 2009-07-10 16:05:09