【发布时间】:2012-05-28 11:09:24
【问题描述】:
我正在更新我的一个结构,我想向它添加一个 std::string 成员。原始结构如下所示:
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
仅仅向联合中添加一个 std::string 成员当然会导致编译错误,因为通常需要添加对象的非平凡构造函数。 In the case of std::string (text from 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 是如何工作的。
我可以请人向我解释清楚一点吗?
【问题讨论】:
-
在我看来你真正需要的是一个合适的variant...
-
我已经有一个在别处使用的变体类。在这种情况下我没有使用它,因为这是用于网络上的序列化数据,我想保持数据很小,所以 Variant 保持内部的所有内容(如键入信息)到我想保持外部并决定的类什么是基于数据包模式的。
标签: c++ constructor c++11 anonymous unions