理解聯合限制
在 C 中,聯合表示由多個資料成員共享的記憶體區域。但是,編譯器限制在聯合體中使用具有重要建構子、複製建構子或析構函數的類別。
問題
嘗試使用以下方式宣告聯合時字串成員,如下所示:
編譯器會引發錯誤,表明U::s 有一個副本建構子。
為什麼有限制?
有此限制是因為在聯合體中包含非平凡操作的類別會帶來記憶體管理挑戰。在典型的結構中,每個成員都分配有自己的記憶體。然而,在聯合體中,所有成員共享相同的記憶體位址。
考慮下面的範例:
如果 u 是一個結構體,則 u.x 和 u.y 將初始化為空字串和向量,分別。然而,在聯合體中,u.x 和 u.y 共享相同的位址。因此,初始化其中一個會覆蓋另一個的資料。
替代方案:標記聯合和可擴展性
為了解決這個問題,C 0x 引入了「標記聯合」。 「這些聯合允許使用成員變數來指示哪個成員是活動的,從而允許更靈活地建構和銷毀聯合內的類別成員。
或者,Boost.Variant 和Boost.Any 等外部函式庫提供類似的功能,同時封裝了記憶體管理的複雜性。
以上是為什麼我不能在 C 聯合中使用具有重要建構子的類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!