模板類別中的靜態成員初始化
初始化模板類別的靜態成員時,必須了解模板實例化如何影響成員定義。
在提供的程式碼中,靜態成員初始化被包裝在嵌套的輔助結構中,以避免問題非模板化類別。
但是,當封閉類別由模板參數化時,除非在主程式碼中存取輔助對象,否則巢狀初始化結構可能不會被實例化。
了解隱式模板實例化
模板中靜態成員初始化的行為受 ISO/IEC 管轄C 2003 標準 (14.7.1)。根據此標準:
- 除非明確實例化或專門化,否則類別模板的成員在需要其定義的上下文中引用時會隱式實例化。
- 靜態資料的初始化僅當資料成員本身以需要其存在的方式使用時,成員才會出現。
代碼Analysis
-
[1] 評論和[2][1]
評論和- [2][1] 評論和
[2]- [1] 評論和[2][1] 評論和
[2]- [1] 評論和[2][1] 評論和
[2]
[1]
評論和[2] [1]
對靜態資料成員的引用,因此它們的定義(包括聲明和實例化)沒有被創建,導致沒有邊
[1] 未註釋:B
::getB () 引用B::mB,要求其存在。然而,未使用 B::mInit,導致其未實例化。 B::InitHelper 的建構子未執行,導致 B::mB 未分配。 [1] 和[2] 未註釋:由於有關順序的未指定行為,這在您的情況下有效[1] 已註釋,[2] 未註釋:B::mB 透過B::getHelper() 引用。但是,由於 B::mInit 不是首先建構的,因此它的建構子嘗試分配給尚未建構的字串對象,從而導致段錯誤。 結論和優雅解決方案標準行為意味著靜態資料成員不會自動初始化,除非使用它們。為了避免此問題,請考慮在引用靜態資料成員之前使用明確專業化來明確定義它們。這強制執行有序初始化,因為顯式專業化被視為常規聲明。 以上是為什麼模板類別中的靜態成員在使用時未初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!