理解联合限制
在 C 中,联合表示由多个数据成员共享的内存区域。但是,编译器限制在联合体中使用具有重要构造函数、复制构造函数或析构函数的类。
问题
尝试使用以下方式声明联合时字符串成员,如下所示:
union U { int i; float f; string s; };
编译器会引发错误,表明 U::s 有一个副本构造函数。
为什么有限制?
存在此限制是因为在联合体中包含非平凡操作的类会带来内存管理挑战。在典型的结构中,每个成员都分配有自己的内存。然而,在联合体中,所有成员共享相同的内存地址。
考虑下面的示例:
union U { string x; vector<int> y; }; U u; // <--
如果 u 是一个结构体,则 u.x 和 u.y 将被初始化为空字符串和向量,分别。然而,在联合体中,u.x 和 u.y 共享相同的地址。因此,初始化其中一个会覆盖另一个的数据。
替代方案:标记联合和可扩展性
为了解决这个问题,C 0x 引入了“标记联合”。 ”这些联合允许使用成员变量来指示哪个成员是活动的,从而允许更灵活地构造和销毁联合内的类成员。
或者,Boost.Variant 和 Boost.Any 等外部库提供类似的功能,同时封装了内存管理的复杂性。
以上是为什么我不能在 C 联合中使用具有重要构造函数的类?的详细内容。更多信息请关注PHP中文网其他相关文章!