#опытным
В прошлом посте мы упомянули, что union - это такой специальный класс. Это что значит, объединение может иметь методы?
Представьте себе, да!
Начиная с С++11 union'ы могут иметь полноценные конструкторы, деструкторы и другие методы.
Но есть ограничения:
👉🏿 не должно быть виртуальных методов
👉🏿 юнион не может быть наследником
👉🏿 юнион не может быть базовым классом
👉🏿 юнион не может хранить ссылочные типы
Во всем остальном - такой же класс!
Но вот как-то не можется мне придумать юзкейсы методов объединения.
Конструкторы и деструкторы нужны, чтобы union мог хранить объекты классов с нетривиальными дефолтными конструкторами и деструкторами.
Например:
union U {
int i;
float f;
std::string s;
};
U u;Попытка скомпилировать это дело приведет к ошибкам:
error: use of deleted function 'U::U()'
error: union member 'U::s' with non-trivial
'constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string()
requires is_default_constructible_v<_Alloc>
error: use of deleted function 'U::~U()'
error: union member 'U::s' with non-trivial
'constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::~basic_string()
Плюс объекты хочется перемещать и мувать, там тоже могут быть нетривиальные специальные методы.
union U {
U() {}
~U() {}
int i;
float f;
std::string s;
};
U u; // ОКНу а если уж разрешили специальные методы определять, то и обычные разрешили до кучи.
А вы используете методы объединений в своих проектах? Если да, то расскажите зачем оно может понадобиться, будет интересно.
Expand your horizons. Stay cool.
#cppcore #cpp11