我有一个指向 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_cast
。 void
是一种特殊的非具体类型,因此您可以
static_cast
指向和指向 void
的指针的任何类型的指针。
void*
只是另一种具体的指针类型,因此可以转换为
指向它的指针遵循通常的规则(并且需要
reinterpret_cast
)。
在很多方面,情况很像int
和double
,其中
void*
扮演 int
(比方说)的角色,Fred*
扮演 double
的角色。
int
和 double
之间的 static_cast
没有问题,但是
int*
和 double*
之间的转换需要 reinterpret_cast
。
关于c++ - 为什么我需要 reinterpret_cast 将 Fred ** const 转换为 void ** const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11410783/