C ++ 11 união anônima com membros não triviais
Estou atualizando uma estrutura minha e eu estava querendo adicionar um membro std :: string a ele. A estrutura original se parece com isso:
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
Apenas adicionar um membro std :: string à união, é claro, causa um erro de compilação, porque normalmente seria necessário adicionar os construtores não-triviais do objeto.No caso de std :: string (texto de informit.com)
Como std :: string define todas as seis funções especiais de membro, U terá um construtor padrão, construtor de cópia, operador de atribuição de cópia, construtor de movimento, operador de atribuição de movimento e destruidor. Efetivamente, isso significa que você não pode criar instâncias de U, a menos que você defina algumas ou todas as funções de membros especiais explicitamente.
Em seguida, o site continua fornecendo o seguinte código de amostra:
union U
{
int a;
int b;
string s;
U();
~U();
};
No entanto, estou usando uma união anônima em uma estrutura. Eu pedi ## C ++ no freenode e eles me disseram que a maneira correta de fazer isso era colocar o construtor no struct e me deu este código de exemplo:
#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)
{
}
Mas a partir daí não consigo imaginar como fazer o resto das funções especiais que o std :: string precisa definir e, além disso, não estou totalmente claro sobre como o ctor nesse exemplo está funcionando.
Posso pedir a alguém para me explicar isso um pouco mais claro?