C ++ 11让我们可以在联盟中使用非POD类型,比如说我有以下代码;
union
{
T one;
V two;
} uny;
在我班级的某个地方,一次只有一名成员活跃,现在我的问题很简单。
答案 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数据类型。