Я обновляю мою структуру, и я хотел добавить к ней члена std::string. Исходная структура выглядит следующим образом:
struct Value {
uint64_t lastUpdated;
union {
uint64_t ui;
int64_t i;
float f;
bool b;
};
};
Просто добавление члена std::string к объединению, конечно, вызывает ошибку компиляции, потому что обычно нужно добавлять нетривиальные конструкторы объекта. В случае std::string (текст из informit.com)
Так как std::string определяет все шесть специальных функций-членов, U будет иметь неявно удаленный конструктор по умолчанию, конструктор копирования, оператор присваивания копии, конструктор перемещения, оператор назначения перемещения и деструктор. Эффективно это означает, что вы не можете создавать экземпляры U, если вы явно не определяете некоторые или все специальные функции-члены.
Затем веб-сайт продолжает приводить следующий пример кода:
union U
{
int a;
int b;
string s;
U();
~U();
};
Однако я использую анонимный союз внутри структуры. Я спросил ## С++ на freenode, и они сказали мне, что правильный способ сделать это - поместить конструктор в структуру вместо этого и дать мне этот примерный код:
#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)
{
}
Но оттуда я не могу понять, как сделать остальные специальные функции, определенные std::string, и, кроме того, я не совсем понимаю, как работает ctor в этом примере.
Могу ли я заставить кого-то объяснить это мне немного понятнее?