Здравствуйте, _NN_, Вы писали:
R>>Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?
_NN>Ну да.
_NN>Компилятор вполне может добавить для убоства выравнивание.
_NN>Почему для структуры B мы можем подумать про выравнивание, а в A нет?
_NN>_NN>struct A{
_NN> char c[7];
_NN>};
_NN>struct B{
_NN> int32_t a;
_NN> char c[3];
_NN>};
_NN>
Такого варианта, как в struct B, быть не может, т.к. это нарушет требования пунткта
23.3.3.1/2:
An array is an aggregate that can be list-initialized with up to N elements whose types are convertible to T.
А ещё и использование structured binding накрывается медным тазом:
https://coliru.stacked-crooked.com/a/f1d776aa7584f914.
В описании std::array до C++14 включительно присутствовали такие строчки:
23.3.2.1 Class template array overview
1 The elements of an array are stored contiguously, meaning that if a is an array<T, N> then it obeys the identity &a[n] == &a[0] + n for all 0 <= n < N.
Это утверждение исключает возможность расположения данных в std::array отличное от расположения данных во встроенных массивах.
Начиная с C++17 просто изменилась структура документа и формулировки, без принципиального изменения эффекта. Просто эти требования переехали в пунткты о
contiguous container и
contiguous iterator. Особенно интересен пункт
24.3.4.14/2.
По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.