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

时间:2013-11-04 08:42:10

标签: c++ c++11 unions pod discriminated-union

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

union
{
    T one;
    V two;
} uny;

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

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

2 个答案:

答案 0 :(得分:14)

你主要靠自己。标准中的注释解释了这个(9.5 / 2):

  

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

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

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

  

通常,必须使用显式析构函数调用和放置新运算符来更改活动   工会会员。

答案 1 :(得分:0)

联盟的替代方案:

std::any / std::variant(C ++ 17)

boost::any / boost::variant

这些允许使用非POD数据类型。