Доступ к неактивному члену одного типа в союзах

У меня есть что-то вроде этого:

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. -конец примечания ]

И ваш structs имеют общую начальную последовательность:

9.2.16 - Члены класса

Общая начальная последовательность двух типов структуры стандартного макета (раздел 9) - это самая длинная последовательность нестатических элементов данных и битовых полей в порядке объявления, начиная с первого такого объекта в каждой из структур, так что соответствующие объекты имеют совместимые с макетом типы, и ни один из них не является битовым полем, или оба являются битовыми полями с одинаковой шириной.

Другие вопросы по тегам