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?