У вас уже есть ответ относительно ограниченного использования возвращаемого указателя, но я хочу добавить, что я также думаю, что вам нужно std::launder
, чтобы даже иметь доступ к первым Pixel
:
reinterpret_cast
выполняется до создания любого Pixel
объекта (при условии, что вы не делаете это в getSomeImageData
). Поэтому reinterpret_cast
не изменит значение указателя. Полученный указатель будет по-прежнему указывать на первый элемент массива std::byte
, переданный функции.
Когда вы создаете объекты Pixel
, они будут вложенными в пределах Массив std::byte
и массив std::byte
будут , обеспечивая хранилище для Pixel
объектов.
В некоторых случаях повторное использование хранилища приводит к тому, что указатель на старый объект автоматически указывает на новый объект. Но это не то, что здесь происходит, поэтому result
все равно будет указывать на объект std::byte
, а не на объект Pixel
. Я предполагаю, что использование его так, как если бы оно указывало на Pixel
объект, технически будет неопределенным поведением.
Я думаю, что это сохраняется, даже если вы делаете reinterpret_cast
после создания Pixel
объект, поскольку объект Pixel
и std::byte
, который предоставляет хранилище для него, не являются взаимозаменяемыми по указателю . Таким образом, даже тогда указатель будет продолжать указывать на std::byte
, а не на объект Pixel
.
Если вы получили указатель для возврата из результата одного из новых мест размещения, то все должно быть в порядке что касается доступа к этому указанному c Pixel
объекту.
Также необходимо убедиться, что указатель std::byte
правильно выровнен для Pixel
и что массив действительно достаточно велик. Насколько я помню, стандарт не требует, чтобы Pixel
имел такое же выравнивание, как std::byte
, или чтобы он не имел отступов.
Также все это не зависит от Pixel
быть тривиальным или действительно любым другим свойством этого. Все будет вести себя так же, пока массив std::byte
имеет достаточный размер и соответствующим образом выровнен для объектов Pixel
.