Как преобразовать массив байтов в тип без UB?C++

Программы на C++. Форум разработчиков
Anonymous
Как преобразовать массив байтов в тип без UB?

Сообщение Anonymous »

Меня интересует преобразование фрагмента байтов, полученного из файла, в целевой тип (), который удовлетворяет определенным свойствам тривиальности: Это распространенная классическая проблема, которая становится неочевидной, если мы захотим следовать правилу строгого псевдонимов и следить за выравниванием.
Несколько дней спустя я написал два возможных варианта.
Вариант №1

Код: Выделить всё

template
requires ((std::is_same_v || std::is_same_v || std::is_same_v)
&& std::is_trivially_copyable_v)
To from_bytes(const TByte* inp){
alignas(To) TByte buf[sizeof(To)];
To* res = new (buf) To;
std::memcpy(res, inp, sizeof(To));
return *res;
}
Вариант №2

Код: Выделить всё

template
requires (std::is_same_v || std::is_same_v || std::is_same_v)
To from_bytes2(const TByte* inp){
using TArr=TByte[sizeof(To)];
return std::bit_cast(*reinterpret_cast(inp));
}
Вопрос: Согласно стандарту языка C++20, содержит ли какой-либо параметр UB или другие нежелательные эффекты?
Вопрос 2: Я считаю, что ни один из перечисленных вариантов не является полностью идиоматически правильным по отношению к C++20. Итак, каков наиболее классический подход к решению этой проблемы, используя возможности, доступные в C++20?


Подробнее здесь: https://stackoverflow.com/questions/784 ... without-ub

Вернуться в «C++»