Доступ к первому полю структуры через приведение C нарушает строгий псевдоним?

Этот код нарушает строгий псевдоним?

struct {int x;} a;
*(int*)&a = 3

Говоря более абстрактно, допустимо ли приведение между различными типами, если примитивные операции чтения / записи являются правильными?

 Geoffrey Irving17 мар. 2012 г., 19:36
Код будет выглядеть так только после оптимизации компилятора. Я знаю оa.x синтаксис. :)
 ildjarn17 мар. 2012 г., 04:36
@bdonlan: это помеченоc++ также. ; -]
 ildjarn17 мар. 2012 г., 04:33
V-таблицы потенциально на первом месте, так что это территория UB.
 Jens Gustedt17 мар. 2012 г., 09:14
Зачем вам такая вещь? Просто сделать&a.x.
 bdonlan17 мар. 2012 г., 04:36
@ildjarn, vtables не существует в C

Ответы на вопрос(1)

Решение Вопроса

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

Правило наложения имен гласит следующее (§6.5 / 7):

Объект должен иметь свое сохраненное значение, доступное только через выражение lvalue, которое имеет один из следующих типов:

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

Здесь вы будете получать к нему доступ через указатели «типа, совместимого с действующим типом объекта» и «агрегатного или объединенного типа, который включает в себя один из вышеупомянутых типов среди его членов», так что никаких проблем с псевдонимами также не возникает. Таким образом, в Си действительно совершенно законно получить доступ к первому члену структуры, приведя указатель на структуру к типу рассматриваемого члена.

В C ++, однако, вы часто найдете vtables и другие вещи в начале объекта C ++. Однако в вашем конкретном случае ваша структура имеет стандартную компоновку, и это явно разрешено (§9.2 / 20 в n3290, благодаря Люку Дантону! - C ++ 03, очевидно, имеет аналогичное правило, выраженное в терминах объектов POD) ,

 Geoffrey Irving17 мар. 2012 г., 04:52
C ++ определенно не будет учитывать наличие vtable, но я применяю это только в тех случаях, когда таких странностей нет.
 Geoffrey Irving17 мар. 2012 г., 05:12
Хорошо, вопрос упоминает, что структура имеет единственное поле int, которое, среди прочего, не подразумевает vtable. Название уже довольно многословно.
 ildjarn17 мар. 2012 г., 04:59
@ Джеффри: "случаи без такой странности". Ака тривиально копируемые типы? Ака, что вы должны были упомянуть в своем вопросе?
 curiousguy21 июл. 2012 г., 05:11
Вы должны доказать две разные вещи: (1) приведение приведено и возвращает действительный указатель (2) указатель может быть разыменован, доступ к lvalue возможен
 Luc Danton17 мар. 2012 г., 05:46
Соответствующее правило для C ++ 11 состоит в том, что указатель на объект типа структуры стандартного макета может бытьreinterpret_cast указатель на его начальный член (9.2 Class Class [class.mem], параграф 20 в n3290). Это правило (и все, что связано со стандартными типами макетов) предназначено для имитации правил C, которые приведены здесь. C ++ 03 будет иметь подобные вещи, за исключением того, что это будет с точки зрения структуры POD, а не структуры стандартного макета.

Ваш ответ на вопрос