Dan*_*use 12 c++ void-pointers static-cast reinterpret-cast
我有一个const指针指向一个指针Fred,我不明白为什么一个static_cast是不够的.
typedef struct {
int n;
} Fred;
Fred *pFred;
Fred **const ppFred = &pFred;
void **const ppVoid = static_cast<void ** const>(ppFred);
Run Code Online (Sandbox Code Playgroud)
请有人能解释为什么reinterpret_cast需要一个指针转换Fred*为指针void*,但是static_cast是精指针转换Fred为指针void.
Jam*_*nze 12
没有要求a Fred*和a void*具有相同的大小和表示.(我已经在那里他们没有机器的工作,虽然这是我的C++之前天).当你转换Fred*到
void*,你会得到一个新的指针,有可能不同的大小和代表性,但没有关于大小的信息和void*指向对象的表示.你知道它是未知的,并且使用它的唯一方法void*是将它强制转换为
Fred*(模块化的事物,如cv-qualifiers).当您转换Fred**
到void**,你从一个指针转换为具体类型(指针Fred*)的指针到另一个具体类型(指针void*).由于无法保证这两种具体类型具有相同的大小和表示,因此转换需要a
reinterpret_cast. void是一种特殊的非具体类型,因此您可以
static_cast指向指向任何类型的指针void.
void*只是另一个具体的指针类型,因此,指向它的指针遵循通常的规则(并且需要a
reinterpret_cast).
在许多方面,这种情况是非常喜欢int和double,其中
void*扮演的角色int(比如说),以及Fred*该角色double.有没有问题static_cast之间的荷兰国际集团int和double,但之间蒙上int*和double*要求reinterpret_cast.