为什么std::string与C并集不兼容

Why is std::string incompatible with C unions?

本文关键字:不兼容 std string 为什么      更新时间:2023-10-16

可能重复:
为什么编译器不';是否允许std::string在并集内?

当我开始使用C++时,我就知道我有这个问题:编译器不允许我将类型为std::string的变量放入联合中。

那是几年前的事了,但实际上我仍然不知道确切的答案。我读到一些与带有联合不喜欢的字符串的复制函数有关的内容,但仅此而已。

  • 为什么C++STL字符串与并集不兼容

来自维基百科:

C++不允许数据成员是任何具有成熟构造函数/析构函数的类型和/或复制构造函数,或非平凡的复制赋值运算符。特别是,不可能将标准C++字符串作为并集的成员。

这样想:如果你有一个类类型(比如std::string)和基元类型(比如说long)的并集,编译器怎么知道你什么时候使用类类型(在这种情况下需要调用构造函数/析构函数),什么时候使用简单类型?这就是为什么正式的阶级类型不被允许作为工会的成员。

union中不允许使用具有自定义构造函数或自定义析构函数的类。

不过,您可以将此类的指针作为联合成员。

struct X
{
   X() {}
   ~X() {}
};
union A
{
   X x; // not allowed - X has constructor (and destructor too)
   X *px; //allowed!
};

或者,您可以使用boost::variant是一个安全、通用、基于堆栈的区分联合容器

§9.5/1说(格式化和强调是我的)

  • 联合可以具有成员函数(包括构造函数和析构函数),但不能具有虚拟(10.3)函数
  • 工会不应有基层
  • 并集不得用作基类
  • 具有非平凡构造函数(12.1)、非平凡复制构造函数平凡析构函数[12.4]或<强>非平凡复制赋值运算符(13.5.3,12.8)的类的对象不能是并集的成员,也不能是此类对象的数组
  • 如果并集包含静态数据成员或引用类型的成员,则程序为格式错误

有趣!