Моя программа получает сообщения по сети. Эти сообщения десериализуются некоторым промежуточным программным обеспечением (т.е. другим кодом, который я не могу изменить). Моя программа получает объекты, которые выглядят примерно так:
struct Message {
int msg_type;
std::vector<uint8_t> payload;
};
Изучив msg_type
я могу определить, что полезная нагрузка сообщения - это, например, массив значений uint16_t
. Я хотел бы прочитать этот массив без ненужной копии.
Моя первая мысль заключалась в том, чтобы сделать это:
const uint16_t* a = reinterpret_cast<uint16_t*>(msg.payload.data());
Но тогда чтение из a
, похоже, нарушит стандарт. Вот пункт 3.10.10:
Если программа пытается получить доступ к сохраненному значению объекта с помощью glvalue, отличного от одного из следующих типов, поведение не определено:
- динамический тип объекта,
- cv-квалифицированная версия динамического типа объекта,
- тип, аналогичный (как определено в 4.4) для динамического типа объекта,
- тип, который является подписанным или неподписанным типом, соответствующим динамическому типу объекта,
- тип, который является подписанным или неподписанным типом, соответствующим версии с динамическим типом объекта cv,
- совокупный или тип объединения, который включает один из вышеупомянутых типов среди его элементов или нестатических членов данных (включая рекурсивно элемент или нестатический элемент данных субагрегата или содержащегося объединения),
- тип, который является (возможно, cv-квалифицированным) типом базового класса динамического типа объекта,
char
илиunsigned char
type.
В этом случае a
будет glvalue, а uint16_t*
не соответствует ни одному из перечисленных критериев.
Итак, как мне обрабатывать полезную нагрузку как массив значений uint16_t
без вызова неопределенного поведения или выполнения ненужной копии?