2015-06-25 40 views
0

考慮此代碼時,2013例外:VS使用C++ 11個不受限制工會

struct TNumeric { 
    bool Negative; 
    wstring Integral; 
    wstring Fraction; 
}; 
union TValue { 
    // The unnamed structs are needed because otherwise the compiler does not accept it... 
    bool    Bit; 
    struct{ TNumeric Numeric; }; 
    struct{ wstring  Text; }; 
}; 

TNumeric Numeric; 
TNumeric &rNumeric{ Numeric }; 
rNumeric.Integral = L""; 
rNumeric.Integral.push_back(L'X'); //OK, no problem 

TValue Value; 
TValue &rValue{ Value }; 
rValue.Text = L""; 
rValue.Text.push_back(L'X'); //OK, no problem 

rValue.Numeric.Integral = L""; 
rValue.Numeric.Integral.push_back(L'X'); // Exception 

在釋放模式是沒有問題的。在調試模式下運行時,xutility:Access violation reading location 0x0000005C中_Iterator_base12類的方法_Adopt中的最後一條語句存在異常。

在_Adopt代碼僅在_ITERATOR_DEBUG_LEVEL == 2時運行。我試着用

#define _ITERATOR_DEBUG_LEVEL 1 

在我的主要程序添加,但它仍然定義爲2 有沒有一種方法來禁用檢查?

回答

5

VS 2013 doesn't support C++11 unrestricted unions,即它實現工會按C++ 03:

一個對象,具有一個非平凡的構造(12.1),非平凡的拷貝構造函數的類的 (12.8 ),一個不平凡的析構函數 (12.4),或一個不平凡的拷貝賦值運算符(13.5.3,12.8)不能成爲工會

中的一員,您成功地通過使用不知名的結構上當編譯器,但是這並不能解決問題:對象不重要,VS2013不支持。

當您切換到更多的C++ 11兼容的編譯器,如VS 2015年,你就必須實現構造函數,析構函數,拷貝構造函數等,爲工會的方式,安全地構建/自毀/份工會的適當部分。有一個在標準的示例(我引用C++ 14 N4140草案[class.union]/4):

考慮聯合類型的一個目的uU具有非靜態數據成員 的m類型Mn類型N。如果M具有一個非平凡的析構函數和N具有一個非平凡構造 (例如,如果他們聲明或繼承虛函數),的u有源部件可以安全地使用析構函數和放置新切換 從mn操作如下:

u.m.~M(); 
new (&u.n) N; 
+1

另外'的boost :: variant'將採取新的佈局和位置刪除構建/破壞工會元素的照顧。 – AndyG

+0

好的,很清楚!由於空間不是一個至關重要的問題,所以我只會讓聯合體成爲結構體。 –