2015-05-23 31 views
2

是否有任何C++標準保證STL迭代器可以存儲在union中?如果是這樣,哪個標準?在聯合中存儲STL迭代器是否合法?

例如:

union MyUnion { 
    std::vector<int>::iterator iter; 
    size_t size; 
}; 

,我問的是,我移植別人的代碼存儲在工會std::vectorstd::map迭代器和MSVC2013似乎並不喜歡它的原因。我得到錯誤C2621:非法工會成員;類型...有一個拷貝構造函數。我想確定這是代碼中的錯誤,MS STL實現中的錯誤還是編譯器中的錯誤。

非常感謝!

回答

8

您的編譯器已過期。從C++ 03標準,

對象的類的 與非平凡的構造(12.1),非平凡複製構造(12.8),一個非平凡的析構函數 (12.4),或非平凡的複製賦值運算符(13.5.3,12.8)不能是聯合體的成員,也不能是此類對象的數組。

但是,此限制已在C++ 11中刪除。取而代之的是一張紙條:

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

因此它說,當然,你可以把一些與一個不平凡的拷貝構造函數工會裏面,但隨後除非你寫一個拷貝構造函數爲它的工會不會可拷貝你自己。

+0

從哪裏可以獲得所有標準草案的列表? –

+0

@templateboy http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents – Brian