将STL迭代器存储在联合中是否合法?
Is it legal to store an STL iterator inside a union?
是否有任何c++标准保证STL迭代器可以存储在联合中?如果有,是哪个标准?
例如:union MyUnion {
std::vector<int>::iterator iter;
size_t size;
};
我问这个问题的原因是我正在移植别人的代码,这些代码将std::vector
和std::map
迭代器存储在联合中,而MSVC2013似乎不喜欢它。我得到错误C2621:非法工会成员;类型……具有复制构造函数。我想确定这是否是代码中的错误,MS STL实现中的错误,还是我的编译器中的错误。
多谢!
您的编译器已过期。来自c++ 03标准,
一个对象对于具有非平凡构造函数(12.1)、非平凡复制构造函数(12.8)、非平凡析构函数的类(12.4)或非平凡复制赋值操作符(13.5.3,12.8)不能是联合的成员,也不能是该类对象的数组。
然而,这个限制在c++ 11中被删除了。取而代之的是一个注释:
[注:如果联合的任何非静态数据成员具有非平凡的默认值构造函数(12.1),复制构造函数(12.8),移动构造函数(12.8),复制赋值操作符(12.8),move赋值操作符(12.8)或析构函数(12.4),则联合的对应成员函数必须为用户提供的,否则它将被隐式地删除(8.4.3)。- 结束说明]
也就是说,当然,你可以在联合中放入一些具有重要复制构造函数的东西,但联合将不可复制,除非你自己为它写一个复制构造函数
多亏了Brian的回答,我才能够对这个话题进行更多的研究。
正在使用的c++ 11特性称为无限制联合。如果你感兴趣的话,这是工作组的提案。
根据MSDN的这个页面,MSVC 2013和更早的版本不支持无限制联合。
Visual Studio 2014 CTP支持无限制联合
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查函数返回类型是否与STL容器类型值相同
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如何检查C ++ STL列表是否为回文?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- STL 是否为其标头指定标头保护?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- C++/STL 我应该使用哪种算法来检查容器是否有重复项?
- 是否有一个类似STL的函数来用索引的某个函数填充数组
- 如何检查队列是否使用 STL 排序
- STL 库在不同平台上是否不同?
- 是否有任何常规方法可以通知 STL 移动和复制构造函数?
- STL功能用于确定距离是否在n`中
- 是否可以在C STL中获得集合的单个元素
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- 将对象(如 STL 对象)传入和传出静态库是否安全
- 如果其他人在等待,是否有标准的STL或QT方法可以产生互惠码,否则请保留它
- 使用 stl 迭代器封装向量是否很好?如果是?怎么可能呢?
- STL 是否有办法在调用小于之前应用函数