将原始字节转换为任何数据类型

Cast raw bytes to any datatype

我担心我的实施是否不安全或是否可以改进。假设我有一个字节数组(更具体地说,std::byte);将元素的地址转换为空指针,然后再转换为任何数据类型是否安全?

template <typename To>
constexpr To *byte_cast(std::byte &From) {
  return static_cast<To *>(static_cast<void *>(&From));
}

// or rather
template <typename To>
constexpr To *byte_cast(std::byte *From) {
  return static_cast<To *>(static_cast<void *>(From));
}

我正在避免 reinterpret_cast 因为它不可靠。请注意,我希望 T * 保留与它所转换的字节相同的地址。

我确实记得数组可能不适合数据类型,或者字节顺序可能会导致问题,但在我的问题得到回答后两者都会得到解决。

您配对的 static_cast 完全等同于 reinterpret_cast。由于严格的别名违规,两者都会导致 UB(目标类型为 charunsigned charstd::byte 时除外)。

解决方案是std::bitcast<T>(source)。它的界面与您尝试的界面相似,只是它按值 returns。不可能有一个 return 和 pointer/reference.

的“安全 reinterpret_cast

一个不太现代的选择是 std::memcpy