2013-05-04 150 views
10

在C++中的初始化,static構件可能無法在類體內初始化包括下列情況:const整體式在-類的靜態數據成員

  • static成員可以是
  • static成員constexpr文本類型必須

你能解釋爲什麼這些前ceptions?

另外,該式成立:

即使const static數據成員被在類體內初始化,即構件通常應在類定義之外定義。

這我從來沒有理解。這個額外定義有什麼意義?

試圖在這裏得到一些直覺。

+2

關鍵是變量是否會被臭氧使用。只要它不是,你實際上不需要定義它,因爲無論什麼時候引用該變量,它都可以粘貼它的*值*。 – 2013-05-04 11:41:54

+3

這不是一個額外的**定義;這是一個定義。在課堂內部你有一個**聲明**。 – 2013-05-04 12:10:56

+1

由於您可能想要從不同的翻譯單元(= cpp文件)訪問靜態數據成員,因此您必須定義每個翻譯單元引用的「位置」,即定義靜態成員的單個翻譯單元。這與(全局)extern變量是一樣的。 – dyp 2013-05-04 12:17:27

回答

6

爲什麼在類定義中會有一個初始值設定項?

關於兩個例外爲constconstexpr靜態數據成員:

[class.static.data]/3

[注意:在這兩種情況中,構件可能會出現在常量表達式。 - 結束注意]

I.e.使用初始化器,你可以在常量表達式中使用它們,例如

struct s 
{ 
    static std::size_t const len = 10; 
    int arr[len]; 
}; 
std::size_t const s::len; 

如果len沒有在類定義初始化,編譯器不容易知道其在下一行值來定義的arr長度。

人們可以認爲關於允許初始化爲在類定義非const,非constexpr靜態數據成員的,但是這可能與初始化順序的干擾:

[basic.start.init]/2

顯式專用類模板的定義靜態數據成員已經命令初始化。其他類模板靜態數據成員(即,隱式或顯式實例化的特化)具有無序初始化。 具有靜態存儲持續時間的其他非本地變量已經有序初始化。

也就是說,包括初始值的定義的順序很重要。非局部對象的(動態)初始化順序僅在翻譯單元中定義,這是爲什麼必須有一個定義包括非const非靜態數據成員的初始化程序的另一個原因。


這個額外的定義是什麼意思?

這已經在IMO的評論中得到了回答。您可能想要添加ODR,即作爲具有外部鏈接的名稱,靜態數據成員必須(僅)被定義在一個翻譯單元中(如果它是ODR使用的話)。程序員可以選擇這個翻譯單元。