Доступ к неактивному члену одного типа в союзах
У меня есть что-то вроде этого:
union DataXYZ
{
struct complex_t
{
float real, imag;
} complex;
struct vector_t
{
float magnitude, phase;
} vector;
};
У меня есть несколько векторов из них, являющихся памятью рабочего пространства общего назначения, где я использую поля соответственно после семантического контекста.
Я знаю, что чтение поля в объединении - это неопределенное поведение, когда последним активным членом было другое поле (и тип?). Имеет ли это значение, когда типы и макет точно совпадают?
Я комментировал некоторые другие подобные вопросы, просил ссылки, которые гарантируют поведение, но ничего еще не подошло - отсюда и этот вопрос.
1 ответ
Да, вы можете прочитать другой участник в этом конкретном случае.
Вот что говорит стандарт C++11/14:
9.5 - Союзы
В объединении самое большее один из элементов не статических данных может быть активным в любое время, то есть значение самое большее одного из участников не статических данных может быть сохранено в объединении в любое время.
Но примечание сразу после раздела делает ваш конкретный экземпляр законным, поскольку для упрощения использования союзов делается одна специальная гарантия:
[ Примечание: Если объединение стандартной компоновки содержит несколько структур стандартной компоновки, которые имеют общую начальную последовательность (9.2), и если объект этого типа объединения стандартной компоновки содержит одну из структур стандартной компоновки, разрешается проверять общая начальная последовательность любого из элементов структуры стандартного макета; см. 9.2. -конец примечания ]
И ваш struct
s имеют общую начальную последовательность:
9.2.16 - Члены класса
Общая начальная последовательность двух типов структуры стандартного макета (раздел 9) - это самая длинная последовательность нестатических элементов данных и битовых полей в порядке объявления, начиная с первого такого объекта в каждой из структур, так что соответствующие объекты имеют совместимые с макетом типы, и ни один из них не является битовым полем, или оба являются битовыми полями с одинаковой шириной.