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

Alo*_*ave 16 c++ unions c++11

我收集unrestricted unions了C++ 11中提出的功能之一.任何人都可以解释这背后的语义及其提供的优势吗?

Kla*_*aim 22

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

在询问C++ 0x功能解释之前先搜索那里.

不受限制的工会

在标准C++中,对于哪些类型的对象可以是联合的成员存在限制.例如,联合不能包含任何定义非平凡构造函数的对象.C++ 0x将减轻这些限制,允许联合使用以前不允许使用的更多类型.[6] 这是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.
};
Run Code Online (Sandbox Code Playgroud)

这些更改不会破坏任何现有代码,因为它们只会放宽当前规则.


Bo *_*son 8

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

更改只是您现在可以在工会中存储非POD类型.但是,您将负责显式构造和销毁该成员.

从N3242:

[示例:考虑联合类型U的对象u,其具有类型为M的非静态数据成员m和类型为N的n.如果M具有非平凡的析构函数且N具有非平凡的构造函数(例如,如果它们声明或继承虚函数),u的活动成员可以使用析构函数和放置new运算符安全地从m切换到n,如下所示:
um~M();
新的(&u.n)N;
- 末端的例子]

IMO并不是一个广泛有用的功能.