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

Ros*_*ina 2 c++ stl unions

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

例如:

union MyUnion {
   std::vector<int>::iterator iter;
   size_t size;
};
Run Code Online (Sandbox Code Playgroud)

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

非常感谢!

Bri*_*ian 8

您的编译器已过期.从C++ 03标准来看,

具有非平凡构造函数(12.1),非平凡复制构造函数(12.8),非平凡析构函数(12.4)或非平凡复制赋值运算符(13.5.3,12.8)的类的对象不能是一个联盟的成员,也不是一系列这样的对象.

但是,此限制已在C++ 11中删除.而是有一个说明:

[ 注意:如果union的任何非静态数据成员具有非平凡的默认构造函数(12.1),复制构造函数(12.8),移动构造函数(12.8),复制赋值运算符(12.8),移动赋值运算符(12.8),或者析构函数(12.4),联合的相应成员函数必须是用户提供的,否则将为联合隐式删除(8.4.3).- 结束说明 ]

所以它说,当然,你可以在一个联合中放入一些非平凡的复制构造函数,但是除非你自己为它编写一个复制构造函数,否则union不会是可复制的.