为什么std::string与C并集不兼容
Why is std::string incompatible with C unions?
可能重复:
为什么编译器不';是否允许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)的类的对象不能是并集的成员,也不能是此类对象的数组强>
- 如果并集包含静态数据成员或引用类型的成员,则程序为格式错误
有趣!
相关文章:
- 为什么范围算法与 std 的迭代器不兼容?
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 类型"std::array<char,6>"和"char"不兼容
- 从 std::streambif 继承时不兼容析构函数编译器警告
- OpenCL 和 std::vector<bool> 不兼容
- 类成员容器迭代器在成员函数std::find中不兼容,但为什么不兼容呢
- 类型 "std::string (*)[10]" 的参数与类型 "Movie *" 的参数不兼容
- 对于将 const char 分配给 std::string 的这种代码不兼容类型的错误,我不断收到此错误
- OpenCV与std::vector不兼容?(_crtIsValidHeapPointer错误)
- 在将 std::string 分配给 char[n] 以进行 POD 初始化时,如何解决不兼容的类型
- std::thread.join()和SFML不兼容
- Transform_iterator与std::iterators不兼容
- 3 智能感知:声明与"<error-type>Airport::getDetails(std::string)"不兼容
- 为什么std::string与C并集不兼容
- std::list擦除不兼容的迭代器
- std::vector断言失败(vector迭代器不兼容)
- vc++ 11 - std::condition_variable_any与标准不兼容