在工会中存储STL迭代器是否合法?

时间:2015-05-23 20:12:26

标签: c++ stl unions

是否有任何C ++标准保证STL迭代器可以存储在联合中?如果是这样,哪个标准?

例如:

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

我问的原因是我正在移植别人的代码,将std::vectorstd::map迭代器存储在联合中,而MSVC2013似乎并不喜欢它。我收到错误C2621:非法工会成员; type ...有一个复制构造函数。我想确定这是代码中的错误,MS STL实现中的错误,还是编译器中的错误。

非常感谢!

2 个答案:

答案 0 :(得分: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)联盟。 - 结束记录]

所以它说,当然,你可以把一些带有非平凡复制构造函数的东西放在一个联合中,但是除非你自己为它写一个拷贝构造函数,否则它不会是可复制的。

答案 1 :(得分:1)

感谢Brian的回答,我能够更多地研究这个话题。

正在使用的C ++ 11功能称为 unrestricted union In case you're interested, here is the working group proposal

根据this page at MSDN,MSVC 2013及更早版本不支持不受限制的工会。

Visual Studio 2014 CTP does support unrestricted unions