Рассмотрим этот код в области блока:
struct foo { unsigned char a; unsigned char b; } x, y;
x.a = 0;
y = x;
C [N1570] 6.3.2.1 2 говорит: "Если lvalue обозначает объект с автоматическим временем хранения, который мог быть объявлен с классом хранения register (никогда не был принят его адрес), и что объект не инициализирован (не объявлен с инициализатором, и до его использования не выполнялось присвоение), поведение undefined."
Хотя члену x
присвоено значение, не было присвоено значение x
, и его адрес не был выполнен. Таким образом, оказывается, что 6.3.2.1 2 показывает, что поведение x
в y = x
равно undefined.
Однако, если бы мы присвоили значение каждому члену x
, было бы необоснованным считать x
неинициализированным для целей 6.3.2.1 2.
(1) Есть ли что-нибудь в стандарте, которое, строго говоря, вызывает 6.3.2.1 2 не применять (make undefined) код выше?
(2) Предположим, мы модифицировали стандарт или определяли разумную модификацию 6.3.2.1 2, есть ли причины предпочесть одно из следующего за другими? (а) 6.3.2.1 2 не применяется к структурам. (b) Если хотя бы одному элементу структуры присвоено значение, структура не является неинициализированной для целей 6.3.2.1 2. (c) Если все названные элементы структуры 1 были присвоенное значение, структура не является неинициализированной для целей 6.3.2.1 2.
Сноска
1 Структуры могут иметь неназванные элементы, поэтому не всегда можно назначить значение каждому члену структуры. (Члены-члены имеют неопределенное значение, даже если структура инициализирована, на 6.7.9 9.)