C++ C+中提议的无限制工会是什么+;11?

C++ C+中提议的无限制工会是什么+;11?,c++,c++11,unions,C++,C++11,Unions,我收集了无限制的联合,作为C++11中提出的功能之一。有人能解释一下这背后的语义和它提供的优势吗 它只不过是我们一直拥有的旧联合,一个对象一次包含一个不同类型的成员 更改只是现在允许您在联合中存储非POD类型。但是,您将负责显式构造和销毁该成员 从N3242: [P>]示例:考虑具有非静态数据的联合类型U的对象u 类型为m的成员m和类型为n的成员n。如果m有一个非平凡析构函数,而n有一个非平凡构造函数 (例如,如果它们声明或继承虚拟函数),则可以安全地切换u的活动成员 使用析构函数和placem

我收集了
无限制的联合
,作为C++11中提出的功能之一。有人能解释一下这背后的语义和它提供的优势吗

它只不过是我们一直拥有的旧联合,一个对象一次包含一个不同类型的成员

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

从N3242:

[P>]示例:考虑具有非静态数据的联合类型U的对象u 类型为m的成员m和类型为n的成员n。如果m有一个非平凡析构函数,而n有一个非平凡构造函数 (例如,如果它们声明或继承虚拟函数),则可以安全地切换u的活动成员 使用析构函数和placement new运算符从m到n,如下所示:
u、 m.~m();
新的(&u.n)n;
-[结束示例]


这不是一个广泛使用的功能,我想。

维基百科上有一个解释:

在询问有关C++0x特性的解释之前,先在那里搜索

无限制工会

标准C++中的P> 对什么类型有限制 的对象可以是联合的成员。 例如,联合不能包含任何 定义非平凡对象的对象 构造器。C++0x将缓解一些问题 在这些限制中,允许工会 可用于更多类型的 以前是不允许使用的 这是一个简单的例子 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.
};
//用于新放置
#包括
结构点{
点(){}
点(intx,inty):x_ux,y_y{}
int x_uux,y_uux;
};
联合大学{
intz;
双w;
点p;//在C++中是非法的;点有一个非平凡的构造函数。
//但是,这在C++0x中是合法的。
U(){new(&p)Point();}//不支持非平凡的成员函数
//为联合隐式定义;
//如果需要,它们将被删除
//强制手动定义。
};
这些变化不会破坏任何安全性 现有的代码,因为它们只是放松 现行规则


它扩展了联合,允许任何类型的数据,而不仅仅是“普通的旧数据”,使您能够更灵活地将不同类型的数据存储在同一位置,而无需诉诸手动指针黑客

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