Сообщение Re[10]: Placement new для инициализации примитивного типа в от 09.10.2025 17:56
Изменено 09.10.2025 18:26 rg45
Re[10]: Placement new для инициализации примитивного типа в
Здравствуйте, _NN_, Вы писали:
R>>Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?
_NN>Ну да.
_NN>Компилятор вполне может добавить для убоства выравнивание.
_NN>Почему для структуры B мы можем подумать про выравнивание, а в A нет?
_NN>
Такого варианта, как в struct B, быть не может, т.к. это нарушет требования пунткта 23.3.3.1/2:
И использование structured binding накрывается медным тазом: https://coliru.stacked-crooked.com/a/f1d776aa7584f914.
В описании std::array до C++14 включительно присутствовали такие строчки:
Это утверждение исключает возможность расположения данных в std::array отличное от расположения данных во встроенных массивах.
Начиная с C++17 просто изменилась структура документа и формулировки, без принципиального изменения эффекта. Просто эти требования переехали в пунткты о contiguous container и contiguous iterator. Особенно интересен пункт 24.3.4.14/2.
По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.
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 совпадают со встроенными массивами.
Re[10]: Placement new для инициализации примитивного типа в
Здравствуйте, _NN_, Вы писали:
R>>Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?
_NN>Ну да.
_NN>Компилятор вполне может добавить для убоства выравнивание.
_NN>Почему для структуры B мы можем подумать про выравнивание, а в A нет?
_NN>
Такого варианта, как в struct B, быть не может, т.к. это нарушет требования пунткта 23.3.3.1/2:
А ещё и использование structured binding накрывается медным тазом: https://coliru.stacked-crooked.com/a/f1d776aa7584f914.
В описании std::array до C++14 включительно присутствовали такие строчки:
Это утверждение исключает возможность расположения данных в std::array отличное от расположения данных во встроенных массивах.
Начиная с C++17 просто изменилась структура документа и формулировки, без принципиального изменения эффекта. Просто эти требования переехали в пунткты о contiguous container и contiguous iterator. Особенно интересен пункт 24.3.4.14/2.
По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.
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 совпадают со встроенными массивами.