C ++ 11 unión anónima con miembros no triviales
Estoy actualizando una estructura mía y quería agregarle un miembro std :: string. La estructura original se ve así:
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
Por supuesto, solo agregar un miembro std :: string a la unión provoca un error de compilación, porque normalmente se necesitaría agregar los constructores no triviales del objeto.En el caso de std :: string (texto de informit.com)
Dado que std :: string define las seis funciones miembro especiales, U tendrá un constructor predeterminado, constructor de copia, operador de asignación de copia, constructor de movimiento, operador de asignación de movimiento y destructor eliminados implícitamente. Efectivamente, esto significa que no puede crear instancias de U a menos que defina explícitamente algunas o todas las funciones especiales del miembro.
Luego, el sitio web continúa con el siguiente código de muestra:
union U
{
int a;
int b;
string s;
U();
~U();
};
Sin embargo, estoy usando una unión anónima dentro de una estructura. Le pregunté a ## C ++ en freenode y me dijeron que la forma correcta de hacerlo era poner al constructor en la estructura y me dio este código de ejemplo:
#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)
{
}
Pero a partir de ahí no puedo imaginar cómo hacer el resto de las funciones especiales que std :: string necesita definir, y además, no estoy del todo claro sobre cómo funciona el ctor en ese ejemplo.
¿Puedo conseguir que alguien me explique esto un poco más claro?