C ++ 11让我们可以在联盟中使用非POD类型,比如我有以下代码段;
union
{
T one;
V two;
} uny;
在我班级的某个地方,一次只有一名成员活跃,现在我的问题相当简单。
- uny的默认值是多少? - 未定义?
- 每当我的课程被毁坏时,哪些成员(在工会内),是否会被毁坏?
- 假设我必须使用std :: typeinfo来跟踪哪个是活动成员,那么我是否应该在析构函数中对该成员显式调用析构函数?
- 有没有人有语言提案的链接,这改变了工会接受非POD类型?
C ++ 11让我们可以在联盟中使用非POD类型,比如我有以下代码段;
union
{
T one;
V two;
} uny;
在我班级的某个地方,一次只有一名成员活跃,现在我的问题相当简单。
你主要靠自己。标准中的注释解释了这一点(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):
通常,必须使用显式析构函数调用和放置新运算符来更改活动 工会成员。
你主要靠自己。标准中的注释解释了这一点(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):
通常,必须使用显式析构函数调用和放置新运算符来更改活动 工会成员。
联盟的替代方案:
std::any
/ std::variant
(C ++ 17)
boost::any
/ boost::variant
这些允许使用非POD数据类型。