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?