私は自分の構造体を更新していて、それに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は6つの特殊メンバー関数すべてを定義するため、Uには、暗黙的に削除されたデフォルトコンストラクター、コピーコンストラクター、コピー割り当て演算子、ムーブコンストラクター、ムーブ代入演算子、およびデストラクタがあります。事実上、これは、特別なメンバー関数の一部またはすべてを明示的に定義しない限り、Uのインスタンスを作成できないことを意味します。
次に、Webサイトは次のサンプルコードを提供します。
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がどのように機能しているかについて完全に明確ではありません。
誰かにこれをもう少し明確に説明してもらえますか?