簡體   English   中英

關於 C++ 非 POD 聯合的問題

[英]Questions regarding C++ non-POD unions

C++11 給了我們在聯合中使用非 POD 類型的可能性,比如我有以下代碼;

union
{
    T one;
    V two;
} uny;

在我班的某個地方,一次只有一個成員是活躍的,現在我的問題很簡單。

  1. uny 的默認值是多少? - 不明確的?
  2. 每當我的班級被破壞時,哪些成員(在工會內)會被破壞?
    • 假設我必須使用 std::typeinfo 來跟蹤哪個是活動成員,那么我是否應該在析構函數中對該成員顯式調用析構函數?
  3. 有沒有人有語言提案的鏈接,它改變了聯合以接受非 POD 類型?

你主要靠自己。 標准中的注釋對此進行了解釋 (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 數據類型。

這是一個棘手的問題。

也許你可以使用這個:

uny un;
new(&un.one) T;

可以參考https://en.cppreference.com/w/cpp/language/union

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM