有关C++非POD联合的问题

Ske*_*een 12 c++ pod unions discriminated-union c++11

C++ 11让我们可以在联合中使用非POD类型,比如说我有以下代码;

union
{
    T one;
    V two;
} uny;
Run Code Online (Sandbox Code Playgroud)

在我班级的某个地方,一次只有一名成员活跃,现在我的问题相当简单.

  1. uny的默认值是多少? - 未定义?
  2. 每当我的班级被毁坏时,哪些成员(在工会内),是否会被毁坏?
    • 假设我必须使用std :: typeinfo来跟踪哪个是活动成员,那么我是否应该在析构函数中对该成员显式调用析构函数?
  3. 有没有人有语言提案的链接,这会改变工会接受非POD类型?

Ker*_* SB 14

你大多是靠自己.标准中的注释解释了这一点(9.5/2):

如果union的任何非静态数据成员具有非平凡的默认构造函数(12.1),复制构造函数(12.8),移动构造函数(12.8),复制赋值运算符(12.8),移动赋值运算符(12.8)或析构函数( 12.4),union的相应成员函数必须是用户提供的,否则将被隐式删除(8.4.3)union.

因此,如果任何成员构造函数都是非平凡的,则需要为union编写一个构造函数(如果它们都是微不足道的,则默认状态将是未初始化的,如同union { int; double; }).如果任何成员都有析构函数,则需要为union编写析构函数,该析构函数必须注意找出活动元素.

关于无约束联合的典型用法还有一个注释(9.5/4):

通常,必须使用显式析构函数调用和放置新运算符来更改联合的活动成员.