Доступ к неактивному члену одного типа в объединениях

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

union DataXYZ
{
    struct complex_t
    {
        float real, imag;
    } complex;

    struct vector_t
    {
        float magnitude, phase;
    } vector;
};

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

Я знаю, что это поведение undefined для чтения поля в объединении, когда последним активным членом было другое поле (и тип?). Означает ли это, когда типы и макет совпадают?

Я комментирую некоторые другие подобные вопросы, прося ссылки, которые гарантируют поведение, но ничего не появилось - отсюда этот вопрос.

Ответы

Ответ 1

Да, вы можете прочитать другой член в этом частном случае.

Это то, что должен сказать стандарт С++ 11/14:

9.5 - Союзы

В объединении может быть активным не более одного из нестатических элементов данных в любое время, то есть значение не более одной нестатической информации члены могут быть сохранены в союзе в любое время.

Но заметка сразу после раздела делает ваш конкретный экземпляр законным, так как для упрощения использования союзов делается одна специальная гарантия:

[Примечание. Если соединение стандартного макета содержит несколько стандартных макетов структур, которые имеют общую начальную последовательность (9.2), и если объект этого типа стандартного макета объединяет один из стандартных макетов структур, разрешено проверять общую начальную последовательность любого элементов структуры стандартного макета; см. 9.2. -end note]

И ваш struct действительно разделяет общую начальную последовательность:

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

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