Приводит ли доступ к неактивному члену объединения к появлению UB в этом объединении дат?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Приводит ли доступ к неактивному члену объединения к появлению UB в этом объединении дат?

Сообщение Anonymous »

В проекте C++ 20 говорится (проект N4950; §11.4.1 (26)):

В объединении стандартной компоновки с активным членом (11.5) типа структуры T1 разрешается читать нестатический элемент данных m другого члена объединения типа структуры T2 при условии, что m является частью общей начальной последовательности T1 и T2; поведение такое, как если бы был назначен соответствующий член T1.

Они также приводят пример:

Код: Выделить всё

struct T1 { int a, b; };
struct T2 { int c; double d; };
union U { T1 t1; T2 t2; };
int f() {
U u = { { 1, 2 } }; // active member is t1
return u.t2.c; // OK, as if u.t1.a were nominated
}
Я прочитал это следующим образом:
Когда я просматриваю обе структуры, T1 и T2, начиная с самого начала (они говорят «начальная последовательность»), могут быть некоторые члены, которые имеют один и тот же тип данных (они говорят «общий»). Пока это так, я могу получить к ним доступ. Как только они будут отличаться, я больше не смогу к ним получить доступ.
Позвольте мне немного изменить этот пример:

Код: Выделить всё

struct T1 { int a, b, c, d, e; };
struct T2 { int m, n, o, p; double q; };
union U { T1 t1; T2 t2; };
Таким образом, в этом случае я могу получить доступ к членам a или m, b или n, c или o, d или p, но не к e или q, если другой член объединения активен.
Это объединение в моем коде:

Код: Выделить всё

typedef union
{
struct
{
Bool Mon :1;
Bool Tue :1;
Bool Wed :1;
Bool Thu :1;
Bool Fri :1;
Bool Sat :1;
Bool Sun :1;
} Flags;
UInt1    Days;
}  WeekT;
Правильно ли я, что в этом случае не существует общей начальной последовательности членов (один – это пользовательская структура, а другой — UInt1), поэтому необходимо обращаться только к активному члену, и результаты ввода каламбура в UB?
>

Подробнее здесь: https://stackoverflow.com/questions/797 ... date-union
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»