Проблема в том, что объединение w
не является ни конструируемым по умолчанию, ни разрушаемым.Конструктор по умолчанию и деструктор не генерируются неявно, поскольку член c
не является ни тривиально, ни тривиально разрушаемым.Таким образом, наличие члена типа w
просто невозможно.Во втором примере вы удаляете элемент, поэтому проблем нет.
Чтобы сделать w
конструируемым по умолчанию, вы можете определить конструктор по умолчанию:
union w{
int a;
bool b;
std::string c;
w() // Could activate one of the members if so desired
{}
чтобы сделать w
разрушаемым, вы можете определить деструктор (но читать до конца):
~w(){
//TODO destruct the active member
}
} w;
Подсказки для уничтожения активного члена:
- Невозможновыяснить, какой участник активен.
- Доступ к неактивному члену имеет неопределенное поведение
- Если c активен, не уничтожая его, имеет неопределенное поведение
В заключение: вынеобходимо убедиться, что w
никогда не уничтожается при активном участнике c
.Такой инвариант мог бы быть реализован в деструкторе Data_Set2
, предполагая, что v
указывает, какой элемент является активным (который является другим инвариантом, который должен поддерживаться; эти члены, вероятно, не должны быть публичными).