Я не думаю, что это UB.
С reinterpret_cast<std::vector<char>*>(&ints)
вы приводите векторный объект к другому векторному объекту другого (и фактически несовместимого) типа. Тем не менее, вы не разыменовываете результирующий указатель, и - поскольку оба векторных объекта, скорее всего, будут иметь одинаковые ограничения псевдонимов, приведение будет в порядке. Cf, например, это онлайн-проект C ++). Обратите внимание, что вектор не хранит типы данных «на месте», но будет содержать указатель на значения.
5.2.10 Повторное толкование акта
(7) Указатель объекта может быть явно преобразован в указатель объекта
другой тип. 70 Когда значение v типа «указатель на T1» равно
преобразованный в тип «указатель на cv T2», результат будет static_cast (static_cast (v)), если оба T1 и T2 имеют стандартную компоновку
типы ([basic.types]) и требования выравнивания T2
более строгие, чем у T1, или если любой из типов является недействительным. Преобразование
prvalue типа «указатель на T1» на тип «указатель на T2» (где T1
и T2 являются типами объектов и где требования выравнивания T2
не более строгие, чем у T1), и обратно в исходный тип дает
исходное значение указателя. Результат любого другого такого указателя
конверсия не указана.
Таким образом, приведение векторного объекта вперед и назад должно работать определенным образом.
Во-вторых, вы применяете указатель, который изначально указывает (и имеет псевдоним) int
«назад» к исходному типу int
. Так что псевдонимы явно не нарушаются.
Я не вижу здесь никакого UB (если только у векторного объекта не было более строгих правил наложения имен, чем у векторного объекта, что, скорее всего, не так).