Anonyme C ++ 11-Union mit nicht-trivialen Mitgliedern

Ich aktualisiere eine Struktur von mir und wollte ihr ein std :: string-Mitglied hinzufügen. Die ursprüngliche Struktur sieht folgendermaßen aus:

struct Value {
  uint64_t lastUpdated;

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

Das Hinzufügen eines std :: string-Members zur Union führt natürlich zu einem Kompilierungsfehler, da normalerweise die nicht trivialen Konstruktoren des Objekts hinzugefügt werden müssen.Bei std :: string (Text von informit.com)

Da std :: string alle sechs speziellen Elementfunktionen definiert, verfügt U über einen implizit gelöschten Standardkonstruktor, einen Kopierkonstruktor, einen Kopierzuweisungsoperator, einen Verschiebungskonstruktor, einen Verschiebungszuweisungsoperator und einen Destruktor. Im Endeffekt bedeutet dies, dass Sie keine Instanzen von U erstellen können, es sei denn, Sie definieren einige oder alle speziellen Elementfunktionen explizit.

Anschließend gibt die Website den folgenden Beispielcode aus:

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

Ich verwende jedoch eine anonyme Union innerhalb einer Struktur. Ich habe ## C ++ auf freenode gefragt und sie haben mir gesagt, dass die richtige Vorgehensweise darin besteht, den Konstruktor stattdessen in die Struktur zu setzen und mir diesen Beispielcode zu geben:

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

Aber von dort aus kann ich nicht herausfinden, wie der Rest der speziellen Funktionen definiert werden soll, die std :: string benötigt, und außerdem ist mir nicht ganz klar, wie der ctor in diesem Beispiel funktioniert.

Kann ich jemanden bitten, mir das etwas klarer zu erklären?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage