c++ 11中提出的无限制联合是什么?

What are Unrestricted Unions proposed in C++11?

本文关键字:是什么 无限制 c++      更新时间:2023-10-16

我认为unrestricted unions是c++ 11中提出的功能之一。有人能解释一下这背后的语义和它提供的优势吗?

维基百科上有解释:http://en.wikipedia.org/wiki/C%2B%2B0x#Unrestricted_unions

在询问c++ 0x特性解释之前先在那里搜索。

不受限制的联合

在标准c++中对什么类型有限制Of对象可以是联合的成员。例如,联合不能包含任何对象定义了一个非平凡的构造函数。c++ 0x将减轻一些问题在这些限制中,允许工会用于更多的类型以前是不允许使用的[6]。这是a的一个简单例子c++ 0x允许的联合:

//for placement new
#include <new>
struct Point  {
    Point() {}
    Point(int x, int y): x_(x), y_(y) {}
    int x_, y_;
};
union U {
    int z;
    double w;
    Point p;  // Illegal in C++; point has a non-trivial constructor. 
              //   However, this is legal in C++0x.
    U() { new( &p ) Point(); } // No nontrivial member functions are
                               //implicitly defined for a union;
                               // if required they are instead deleted
                               // to force a manual definition.
};

更改不会破坏任何现有的代码,因为他们只放松当前规则。

这就是我们一直拥有的旧联合,一个对象每次包含一个不同类型的成员。

变化只是现在允许在联合中存储非pod类型。但是,您将负责显式地构造和销毁该成员。

从N3242:

[示例:考虑一个具有非静态数据的联合类型u的对象u成员m为m类型,n为n类型,如果m有非平凡析构函数n有非平凡构造函数(例如,如果它们声明或继承虚函数),则可以安全地切换u的活动成员使用析构函数和位置new操作符从m到n,如下所示:

u.m。~ M ();new (&u.n) N;
-end example]

它扩展了union以允许任何类型,而不仅仅是"普通的旧数据",从而使您能够更灵活地在同一位置存储不同类型的数据,而无需诉诸手动指针攻击。

你为此付出的代价是你必须做一些仔细的簿记。使用普通的旧数据联合赋值就足以改变"当前类型"。读取错误的类型很可能导致数据乱码,但仅此而已。对于非普通的旧数据联合,您必须跟踪当前类型,并手动调用正确的构造函数和析构函数来更改当前类型,并在销毁整个联合时正确地清理。如果你试图读或写的是书面形式,不好的事情可能会发生