Чтобы устранить проблемы с выравниванием, мне нужно memcpy во временное. Какой тип должен быть временным? gcc жалуется, что следующий reinterpret_cast нарушит строгие правила псевдонимов:
template <typename T>
T deserialize(char *ptr) {
static_assert(std::is_trivially_copyable<T>::value, "must be trivially copyable");
alignas(T) char raw[sizeof(T)];
memcpy(raw, ptr, sizeof(T));
return *reinterpret_cast<T *>(raw);
}
(например, когда T является "длинным" ).
Я не хочу определять T, так как я не хочу создавать T перед его перезаписью.
В объединении не записывается один элемент, а затем считывается другой счет как поведение undefined?
template<typename T>
T deserialize(char *ptr) {
union {
char arr[sizeof(T)];
T obj;
} u;
memcpy(u.arr, ptr, sizeof(T)); // Write to u.arr
return u.obj; // Read from u.obj, even though arr is the active member.
}