[英]Questions regarding C++ non-POD unions
C++11 給了我們在聯合中使用非 POD 類型的可能性,比如我有以下代碼;
union
{
T one;
V two;
} uny;
在我班的某個地方,一次只有一個成員是活躍的,現在我的問題很簡單。
你主要靠自己。 標准中的注釋對此進行了解釋 (9.5/2):
如果聯合的任何非靜態數據成員具有非平凡的默認構造函數 (12.1)、復制構造函數 (12.8)、移動構造函數 (12.8)、復制賦值運算符 (12.8)、移動賦值運算符 (12.8) 或析構函數 ( 12.4),union對應的成員函數必須是用戶提供的,否則會為union隱式刪除(8.4.3)。
因此,如果任何成員構造函數是非平凡的,則需要為聯合編寫一個構造函數(如果它們都是平凡的,則默認狀態將是未初始化的,例如union { int; double; }
)。 如果任何成員有析構函數,則需要為聯合編寫析構函數,該析構函數必須負責找出活動元素。
還有一個關於無約束聯合的典型用法的進一步說明 (9.5/4):
通常,必須使用顯式析構函數調用和放置 new 運算符來更改聯合的活動成員。
聯合的替代方案:
std::any
/ std::variant
(C++17)
boost::any
/ boost::variant
這些允許使用非 POD 數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.