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

Reading from a byte field by void* and reinterpret_cast

本文关键字:字节 字段 读取 cast void reinterpret 通过      更新时间:2023-10-16

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

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

但我有一些疑问:取消引用void*实际上会给reinterpret_cast<T>带来什么?只是那个位置的字节?或者"神奇地"T长度的字节序列?我应该先把void*投进T*吗?

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

指向void的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针相互转换。

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

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