鉴于以下情况:
struct A
{
int a;
};
struct B
{
int b;
};
int main()
{
A a {1};
A* p = &a;
使用
static_cast
和reinterpret_cast
通过void*
进行强制转换会得到相同的结果吗?即以下表达式之间是否有任何区别? static_cast <A*> ( static_cast <void*> (p) );
reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
如果我们使用
static_cast
和 reinterpret_cast
将一个类的指针转换为另一个类的指针,这两个操作符之间有区别吗?以下表达式是否相同? static_cast <B*> ( static_cast <void*> (p) );
reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
reinterpret_cast <B*> ( p );
我可以在这之后使用B*
指针来访问b
成员吗?
p
到B*
的强制类型转换并不总是等同于先转换为void*
-- 这只适用于 OP 的示例。如果A
和B
在层次上有关联,则指针值可以在转换过程中更改。此外,据我所知,从A -> void -> B
的转换始终是未定义行为,无法进行解引用操作,而A -> B
可以合法进行,前提是两种类型具有兼容的布局。 - Human-CompilerA
和B
之间存在层次关系,指针值可以作为强制类型转换的一部分而改变。如果是static_cast<A*>(b_ptr)
,那么是的。如果没有继承,那么这种转换将是不合法的。此外,从A -> void -> B
转换在解引用时始终是未定义行为,而A -> B
则可以是合法的,前提是两个类型具有布局兼容性。如果您指的是reinterpret_cast
并且这些转换是指针,则这两者在所有方面都是相同的,并且无论布局兼容性如何,访问都是未定义的行为。如果您指的是static_cast
,则后者可能是良好定义的。 - eerorikastruct Coordinate{double x, double y, double z}; double *ptr1, *ptr2; Coordinate stSpaceCoord;
请问ptr1 = static_cast<void*>(&stSpaceCoord);
和ptr2 = reinterpret_cast<void*>(&stSpaceCoord);
有什么区别吗?谢谢。 - Johnvoid*
(或从void*
转换)时没有任何区别。 - eerorika