Если вы не делаете это на практике, замените ваш помеченный союз на std::variant
. Это намного более безопасно.
Вместо того, чтобы вызывать конструктор в списке инициализатора члена, вы можете условно вызвать его позже с помощью Placement-New.
Обычно, если вы не указываете конструктор в списке инициализатора члена, вызывается конструктор по умолчанию. Но для членов union {...};
конструктор вообще не вызывается.
LogFile(LogFile&& other) : streamType_(other.streamType_)
{
switch (streamType_)
{
case FILE_STREAM:
new (&fileStream_) std::ofstream(std::move(other.fileStream_)); // <--
break;
case STD_STREAM:
stdStream_ = other.stdStream_;
other.stdStream_ = 0;
break;
}
}
Обратите внимание, что вы должны вручную вызывать деструктор в ~LogFile()
, и вам также необходимо пользовательское назначение перемещения. Вот почему std::variant
лучше.