C++ 通常不会特意鼓励使用联合,如果联合成员有非平凡的构造函数和析构函数,这可能会特别尴尬,因为在这种情况下联合自己的构造函数(分别为析构函数)将被删除并且如果您需要一个(您通常会这样做),您必须自己提供一个。
总的来说,将非 POD 类型放入联合中可能不是一个好主意,因为语义很尴尬;通常,您不能为尚未构造的对象分配值,并且虽然您可以使用placement new 来构造联合的成员,但您无法真正知道该成员以前没有被构造. 此外,如果成员具有显式且非平凡的析构函数,您可以为联合提供显式析构函数,它可以显式调用成员的析构函数,但它如何知道它是否必须这样做?
但是,如果您的工会成员是 POD,那么您很好,但是您仍然不能将工会强制转换为成员或将会员类型强制转换为工会。(GCC 允许将其作为 C 扩展,但 afaikg++
不会以相同的方式扩展 C++。)
尽管如此,没有什么能阻止你给union
a 构造函数。例如:
union long_or_double {
long a;
double d;
long_or_double(long l) : a(l) {}
long_or_double(int i) : a(i) {}
// etc.
long_or_double(double d) : d(d) {}
};
int f(long_or_double u);
int main(int argc, char** argv) {
// Both of these work, because there is an explicit constructor
f(argc);
f(3.7);
// ...
}
如果你不能在联合类型的定义中添加构造函数,我认为你能做的最好的事情就是定义一个make_union
函数,为每个成员类型适当地覆盖它。