在联合中存储 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::vectorstd::map迭代器,而MSVC2013似乎不喜欢它。我收到错误 C2621:非法工会成员; type ... 有一个复制构造函数。我想确定这是代码中的错误、MS STL 实现中的错误还是我的编译器中的错误。

非常感谢!

您的编译器已过时。从 C++03 标准,

An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects.

不过,此限制已在 C++11 中移除。取而代之的是一条注释:

[ Note: If any non-static data member of a union has a non-trivial default constructor (12.1), copy constructor (12.8), move constructor (12.8), copy assignment operator (12.8), move assignment operator (12.8), or destructor (12.4), the corresponding member function of the union must be user-provided or it will be implicitly deleted (8.4.3) for the union. — end note ]

也就是说,当然,你可以在一个联合体中放置一些带有非平凡复制构造函数的东西,但是除非你自己为它编写一个复制构造函数,否则联合体将不可复制。

多亏了 Brian 的回答,我才能够研究更多关于这个主题的信息。

正在使用的 C++11 功能称为无限制联合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.