将STL迭代器存储在联合中是否合法?

Is it legal to store an STL iterator inside a union?

本文关键字:是否 STL 迭代器 存储      更新时间:2023-10-16

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

例如:

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

我问这个问题的原因是我正在移植别人的代码,这些代码将std::vectorstd::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支持无限制联合