通过 void* 和 reinterpret_cast 从字节字段中读取

Reading from a byte field by void* and reinterpret_cast

我计划通过以下方式从 void* 给定的字节字段中读取类型 T

template <class T>
T read(void* ptr){
    return reinterpret_cast<T>(*ptr);
}

但我有一些疑问:取消引用 void* 实际上会给 reinterpret_cast<T> 带来什么?只是那个位置的字节?或者'magically'一个长度为T的字节序列?我应该先将 void* 转换为 T* 吗?

您不能取消引用 void 指针,它不指向对象。但是 C 标准规定:

A pointer to void may be converted to or from a pointer to any object type.

我们可以先将 ptr 转换为 T* 然后 然后 取消引用它:

template <class T>
T read(void* ptr) {
    return *static_cast<T*>(ptr);
}