2013-11-04 23 views
11

C++ 11給了我們在工會中使用非POD類型的可能性,比如說我有以下一段代碼;關於C++非POD工會的問題

union 
{ 
    T one; 
    V two; 
} uny; 

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

  1. uny的默認值是多少? - 未定義?
  2. 每當我的課程被破壞,哪些成員(在工會內),是否會遭到破壞?
    • 假設我必須std :: typeinfo來跟蹤哪些是活動成員,那麼我應該在析構函數中顯式調用析構函數嗎?
  3. 有沒有人有語言建議的鏈接,它改變了工會接受非POD類型?

回答

13

你主要靠自己。在標準的說明解釋了這個(9.5/2):

如果工會的任何非靜態數據成員有一個不平凡的默認 構造函數(12.1),拷貝構造函數(12.8),移動構造函數( 12.8),複製賦值運算符(12.8),移動 賦值運算符(12.8)或析構函數(12.4),工會的相應成員函數必須是用戶提供的 或者將隱式刪除(8.4.3)聯盟。

因此,如果任何成員的構造是不平凡的,你需要編寫工會構造函數(如果他們都是平凡的,默認狀態將未初始化,像union { int; double; })。如果任何成員具有析構函數,則需要爲聯合編寫析構函數,必須注意確定活動元素。

有進一步的說明(9.5/4)關於無約束工會的典型用法:

在一般情況下,必須使用顯式的析構函數調用和放置新的運營商改變工會的積極 成員。

+0

你能澄清一下什麼標準指定了嗎? C++ 11或常規C++? – Pavel

+1

@Pavel:C++ 11,其中*是此時的常規C++。 –

0

替代聯合:

std::any/std::variant(C++ 17)

boost::any/boost::variant

這些允許使用非POD數據類型。

+0

這是一個非常清晰的(和3歲)問題,詢問非POD類型的工會的行爲。如何命名一些替代方案來回答這個問題? –

+1

@ChrisH - 因爲替代品可以提供更好的解決方案。它允許將工會的行爲與新的現代功能進行比較,以處理非POD數據類型。我不明白你對這個問題是3歲的事實的看法;如果現在可以看到,在三三十年的時間裏,它不應該值得更新嗎?RSVP – Pietro

+2

這篇文章提出非常具體的問題,說明與非POD類型的聯合如何表現。如果你要說明替代方法如何比較,你會爲這個問題提供一些相關的東西。事實上,你已經回答了「如何做x'工作」的問題,而「你可以使用'y'來代替」。客觀上不回答所問的問題。即使他們要求替代品,這也不是一個好的答案。簡單地命名替代品而不比較其功能對任何人都沒有多大益處。 –