首頁  >  文章  >  後端開發  >  為什麼模板類別中的靜態成員在使用時未初始化?

為什麼模板類別中的靜態成員在使用時未初始化?

Patricia Arquette
Patricia Arquette原創
2024-11-01 09:33:30257瀏覽

 Why Does My Static Member in a Template Class Not Initialize When Used?

模板類別中的靜態成員初始化

初始化模板類別的靜態成員時,必須了解模板實例化如何影響成員定義。

在提供的程式碼中,靜態成員初始化被包裝在嵌套的輔助結構中,以避免問題非模板化類別。

但是,當封閉類別由模板參數化時,除非在主程式碼中存取輔助對象,否則巢狀初始化結構可能不會被實例化。

了解隱式模板實例化

模板中靜態成員初始化的行為受 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn