c ++ 11 — Вопросы относительно союзов C ++, не являющихся POD

C ++ 11 дал нам возможность использовать не-POD-типы внутри союзов, скажем, у меня есть следующий фрагмент кода;

union
{
T one;
V two;
} uny;

Где-то в моем классе, только один участник будет активен одновременно, теперь мои вопросы довольно просты.

  1. Какое значение по умолчанию uny? — не определено?
  2. Когда мой класс будет уничтожен, какие члены (в рамках союза), если таковые будут, будут уничтожены?
    • Предположим, мне нужно использовать std :: typeinfo, чтобы отследить, какой из них является активным. Должен ли я явно вызывать деструктор для этого члена в деструкторе?
  3. Есть ли у кого-нибудь ссылка на языковое предложение, которое изменило союзы, чтобы принимать не POD-типы?

12

Решение

Вы в основном самостоятельно. Примечание в стандарте объясняет это (9.5 / 2):

Если у какого-либо нестатического члена данных объединения есть нетривиальное значение по умолчанию
конструктор (12.1), конструктор копирования (12.8), конструктор перемещения (12.8), оператор назначения копирования (12.8), перемещение
оператор присваивания (12.8) или деструктор (12.4), соответствующая функция-член объединения должна быть
предоставленный пользователем или он будет неявно удален (8.4.3) для объединения.

Поэтому, если какой-либо из конструкторов-членов нетривиален, вам нужно написать конструктор для объединения (если они все тривиальны, состояние по умолчанию будет неинициализировано, как для union { int; double; }). Если у какого-либо члена есть деструктор, вам нужно написать деструктор для объединения, который должен позаботиться о поиске активного элемента.

Есть еще примечание (9.5 / 4) о типичном использовании неограниченного объединения:

В общем, для смены активного нужно использовать явные вызовы деструктора и размещение новых операторов.
член союза.

14

Другие решения

Альтернативы союзу:

std::any / std::variant (C ++ 17)

boost::any / boost::variant

Это позволяет использовать не-POD типы данных.

0

По вопросам рекламы [email protected]