Re[10]: Placement new для инициализации примитивного типа в
От: rg45 СССР  
Дата: 09.10.25 17:56
Оценка:
Здравствуйте, _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 совпадают со встроенными массивами.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.10.2025 18:26 rg45 . Предыдущая версия . Еще …
Отредактировано 09.10.2025 18:23 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:19 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:08 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:07 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:07 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:06 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:04 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:00 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.