我正在更新我的一个结构,我想向它添加一个 std::string 成员。原始结构如下所示:
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
当然,仅向联合中添加一个 std::string 成员会导致编译错误,因为通常需要添加对象的非平凡构造函数。 在 std::string 的情况下(来自informit.com 的文本)
由于 std::string 定义了所有六个特殊成员函数,因此 U 将具有隐式删除的默认构造函数、复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数。实际上,这意味着您不能创建 U 的实例,除非您明确定义一些或所有特殊成员函数。
然后网站继续提供以下示例代码:
union U
{
int a;
int b;
string s;
U();
~U();
};
但是,我在结构中使用匿名联合。我在 freenode 上询问了##C++,他们告诉我正确的方法是将构造函数放在结构中,并给了我这个示例代码:
#include <new>
struct Point {
Point() {}
Point(int x, int y): x_(x), y_(y) {}
int x_, y_;
};
struct Foo
{
Foo() { new(&p) Point(); }
union {
int z;
double w;
Point p;
};
};
int main(void)
{
}
但是从那里我无法弄清楚如何定义 std::string 需要定义的其余特殊函数,而且,我并不完全清楚该示例中的 ctor 是如何工作的。
我可以请人更清楚地向我解释一下吗?