是否有任何C ++标准保证STL迭代器可以存储在联合中?如果是这样,哪个标准?
例如:
union MyUnion {
std::vector<int>::iterator iter;
size_t size;
};
我问的原因是我正在移植别人的代码,将std::vector
和std::map
迭代器存储在联合中,而MSVC2013似乎并不喜欢它。我收到错误C2621:非法工会成员; type ...有一个复制构造函数。我想确定这是代码中的错误,MS STL实现中的错误,还是编译器中的错误。
非常感谢!
答案 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及更早版本不支持不受限制的工会。