Являются ли структуры переменных одного и того же типа совместимыми со структурой, содержащей массив этого типа?
Являются ли эти 2 структуры совместимыми с макетами?
struct One {
float x, y, z;
};
struct Two {
float c[3];
};
Оба содержат 3 поплавки, поэтому в некотором смысле это описание можно считать истинным (от N3797):
16 Два типа стандартной структуры (раздел 9) совместимы с макетами если они имеют одинаковое количество нестатических элементов данных и соответствующие нестатические члены данных (в порядке объявления) имеют совместимые с макетами типы (3.9).
N4659 имеет другой текст:
Общая начальная последовательность двух структур стандартного макета (раздел 12) типы - это самая длинная последовательность нестатических элементов данных и бит-полей в порядке объявления, начиная с первого такого лица в каждом из структуры, так что соответствующие объекты имеют совместимость с макетами типы и ни один из них не является битовым полем, либо оба являются битовыми полями с той же шириной.
Два типа стандартной структуры (раздел 12) совместимы с макетами классы, если их общая начальная последовательность состоит из всех членов и бит-поля обоих классов (6.9).
Если ответ отрицательный, они не совместимы с макетами, то: было ли это намерение комитета? Возможно, они хотят, чтобы One
и Two
были совместимы с макетами (возможно, член комитета читает это и может уточнить).
Бонусный вопрос: гарантировано ли это, что sizeof(One)==sizeof(Two)
?
Ответы
Ответ 1
Ну, нет:
[...], если они имеют одинаковое количество нестатических элементов данных [...]
One
имеет три члена: x
, y
и z
. Two
имеет один член: c
. Они не имеют одинакового количества нестатических элементов данных, поэтому они не совместимы с макетами.
Новая формулировка отличается, но вы оказываетесь в том же месте. [basic.types] определяет компоновку как:
Два типа cv1 T1 и cv2 T2 являются совместимыми с макетами типами, если T1 и T2 являются однотипными, совместимыми с макетами перечислениями или стандартными типами макета, совместимыми с макетами.
[class.mem] определяет классы, совместимые с макетами:
Два типа структуры стандартной компоновки - это классы, совместимые с макетами, если их общая начальная последовательность содержит все члены и битовые поля обоих классов ([basic.types]).
Если общая начальная последовательность:
Общая начальная последовательность двух типов структуры стандартного макета - это самая длинная последовательность нестатических элементов данных и бит-полей в порядке объявления, начиная с первого такого объекта в каждой из структур, так что соответствующие объекты имеют макет -собираемые типы, и ни одна из них не является битовым полем, либо оба являются битовыми полями с одинаковой шириной.
Здесь первый член One
(float x
) не совместим с макетами с первым членом Two
(float c[3]
), поэтому общая начальная последовательность пуста.
Ответ 2
Компилятору разрешено добавлять дополнения между членами в class
или struct
.
Элементы массива находятся в смежных местах.
Они могут не соответствовать компоновке в зависимости от того, как компилятор организует элементы в struct
.