C ++ 11 anonimowy związek z nietrywialnymi członkami

Aktualizuję moją strukturę i chciałem dodać do niej element std :: string. Oryginalna struktura wygląda tak:

struct Value {
  uint64_t lastUpdated;

  union {
    uint64_t ui;
    int64_t i;
    float f;
    bool b;
  };
};

Po prostu dodanie elementu std :: string do unii powoduje oczywiście błąd kompilacji, ponieważ normalnie należałoby dodać nietrywialne konstruktory obiektu.W przypadku std :: string (tekst z informit.com)

Ponieważ std :: string definiuje wszystkie sześć specjalnych funkcji składowych, U będzie miał domyślnie usunięty konstruktor domyślny, konstruktor kopiowania, operator przypisania kopiowania, konstruktor ruchu, operator przypisania przesunięcia i destruktor. W rzeczywistości oznacza to, że nie można tworzyć instancji U, chyba że jawnie zdefiniujesz niektóre lub wszystkie funkcje specjalne.

Następnie strona internetowa podaje następujący przykładowy kod:

union U
{
int a;
int b;
string s;
U();
~U();
};

Jednak używam anonimowej unii w strukturze. Zapytałem ## C ++ na freenode i powiedzieli mi, jak to zrobić, aby zamiast tego umieścić konstruktor w strukturze i podać mi ten przykładowy kod:

#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)
{
}

Ale stamtąd nie mogę sobie wyobrazić, jak zrobić pozostałe funkcje specjalne, których potrzebuje std :: string, a poza tym nie jestem do końca pewien, jak działa ctor w tym przykładzie.

Czy mogę poprosić kogoś, by wyjaśnił mi to nieco jaśniej?

questionAnswers(2)

yourAnswerToTheQuestion