Ответ 1
Нет, не гарантируется, что весь союз будет обнулен. Только первый объявленный член союза, плюс любое дополнение, гарантированно обнуляется (доказательство ниже).
Итак, чтобы вся область памяти объекта union была обнулена, у вас есть следующие параметры:
- Закажите элементы таким образом, чтобы наибольший член был первым и, следовательно, был обнулен.
- Используйте
std::memset
или эквивалентную функциональность. Чтобы предотвратить случайное забывание об этом, вы можете, конечно, датьSomeData
конструктор по умолчанию, который будет называть это.
Цитата С++ 11:
8.5.4 [dcl.init.list]/3
Список-инициализация объекта или ссылки типа
T
определяется следующим образом:
- Если в списке инициализаторов нет элементов, а
T
- тип класса с конструктором по умолчанию, объект значение инициализации.
8.5 [dcl.init]/7
Для инициализации значения объекта типа
T
означает:
- Если
T
является (возможно, cv-квалифицированным) типом класса (раздел 9) с предоставленным пользователем конструктором (12.1), то вызывается конструктор по умолчанию дляT
(и инициализация плохо сформирована, еслиT
не имеет доступного значения по умолчанию Конструктор);- если
T
является (возможно, cv-квалифицированным) классом типа non-union без конструктора, предоставленного пользователем, тогда объект инициализируется нулем и, еслиT
s неявно объявленный конструктор по умолчанию является нетривиальным, этот конструктор называется.- ...
- в противном случае объект инициализируется нулем.
8.5 [dcl.init]/5:
Для нулевой инициализации объекта или ссылки типа
T
означает:...
- Если
T
является (возможно, cv-квалифицированным) типом объединения, объекты первого нестатического именованного элемента данных инициализируются нулем и заполнение инициализируется нулевыми битами;
Из этих кавычек вы можете видеть, что использование {}
для инициализации data
приведет к инициализации объекта инициализацией объекта (поскольку SomeData
- это тип класса с конструктором по умолчанию).
Значение-инициализация объединения без предоставленного пользователем конструктора по умолчанию (который SomeData
) означает нуль-инициализацию.
Наконец, нуль-инициализация объединения означает нуль-инициализацию первого нестатического имени элемента данных.