gpt4 book ai didi

c++ - 为什么我需要 reinterpret_cast 将 Fred ** const 转换为 void ** const?

转载 作者:IT老高 更新时间:2023-10-28 23:14:13 28 4
gpt4 key购买 nike

我有一个指向 Fred 的指针的 const 指针,但我不明白为什么 static_cast 是不够的。

typedef struct {
int n;
} Fred;

Fred *pFred;
Fred **const ppFred = &pFred;
void **const ppVoid = static_cast<void ** const>(ppFred);

请有人解释为什么需要 reinterpret_cast 将指向 Fred* 的指针转换为指向 void* 的指针static_cast 可以将指向 Fred 的指针转换为指向 void 的指针。

最佳答案

Fred*void* 不要求大小相同和代表性。 (我在他们没有的机器上工作过,虽然那是在我的 C++ 时代之前。)当您将 Fred* 转换为void*,你会得到一个新的指针,它的大小可能不同表示,但没有关于大小和void* 指向的对象的表示。你知道这是未知,并且使用此 void* 的唯一方法是将其转换回Fred*(模数,例如 cv-qualifiers)。当你转换 Fred**void**,您正在从指针转换为具体类型(a指向 Fred* 的指针)指向另一个具体类型的指针(指针到 void*)。而且由于不能保证这两个具体类型具有相同的大小和表示,转换需要reinterpret_castvoid 是一种特殊的非具体类型,因此您可以static_cast 指向和指向 void 的指针的任何类型的指针。void* 只是另一种具体的指针类型,因此可以转换为指向它的指针遵循通常的规则(并且需要reinterpret_cast)。

在很多方面,情况很像intdouble,其中void* 扮演 int(比方说)的角色,Fred* 扮演 double 的角色。intdouble 之间的 static_cast 没有问题,但是int*double* 之间的转换需要 reinterpret_cast

关于c++ - 为什么我需要 reinterpret_cast 将 Fred ** const 转换为 void ** const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11410783/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com