static_cast VS reinterpret_cast 将指针转换为指针时
static_cast VS reinterpret_cast when casting pointers to pointers
给定以下条件:
struct A
{
int a;
};
struct B
{
int b;
};
int main()
{
A a {1};
A* p = &a;
使用 static_cast
和通过 void*
使用 reinterpret_cast
进行转换会得到相同的结果吗?即以下表达式之间有什么区别吗?
static_cast <A*> ( static_cast <void*> (p) );
reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
如果我们用 static_cast
和 reinterpret_cast
将指向一个 class 的指针转换为指向另一个 class 的指针会怎样?这两个运营商之间有什么区别吗?下列表达式是否相同?
static_cast <B*> ( static_cast <void*> (p) );
reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
reinterpret_cast <B*> ( p );
我可以在这之后使用 B*
指针来访问 b
成员吗?
is there any difference between the following expressions?
static_cast <A*> ( static_cast <void*> (p) );
reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
没有
Are the following expressions the same?
static_cast <B*> ( static_cast <void*> (p) );
reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
reinterpret_cast <B*> ( p );
是的。
理解这一点的简单方法是考虑如何指定从指针到指针的reinterpret_cast。 reinterpret_cast<T*>(ptr)
被指定为与 static_cast<T*>(static_cast<void*>(ptr))
完全相同的行为(为简单起见,我省略了 cv 限定符)。
当然,static_cast<T>(static_cast<T>(anything))
等同于 static_cast<T>(anything)
,因为外部转换始终是身份转换。
Can I use B* pointer after this to access b member?
没有。如果你这样做,那么程序的行为将是不确定的。
给定以下条件:
struct A
{
int a;
};
struct B
{
int b;
};
int main()
{
A a {1};
A* p = &a;
使用 static_cast
和通过 void*
使用 reinterpret_cast
进行转换会得到相同的结果吗?即以下表达式之间有什么区别吗?
static_cast <A*> ( static_cast <void*> (p) );
reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
如果我们用 static_cast
和 reinterpret_cast
将指向一个 class 的指针转换为指向另一个 class 的指针会怎样?这两个运营商之间有什么区别吗?下列表达式是否相同?
static_cast <B*> ( static_cast <void*> (p) );
reinterpret_cast <B*> ( reinterpret_cast <void*> (p) );
reinterpret_cast <B*> ( p );
我可以在这之后使用 B*
指针来访问 b
成员吗?
is there any difference between the following expressions?
static_cast <A*> ( static_cast <void*> (p) ); reinterpret_cast <A*> ( reinterpret_cast <void*> (p) );
没有
Are the following expressions the same?
static_cast <B*> ( static_cast <void*> (p) ); reinterpret_cast <B*> ( reinterpret_cast <void*> (p) ); reinterpret_cast <B*> ( p );
是的。
理解这一点的简单方法是考虑如何指定从指针到指针的reinterpret_cast。 reinterpret_cast<T*>(ptr)
被指定为与 static_cast<T*>(static_cast<void*>(ptr))
完全相同的行为(为简单起见,我省略了 cv 限定符)。
当然,static_cast<T>(static_cast<T>(anything))
等同于 static_cast<T>(anything)
,因为外部转换始终是身份转换。
Can I use B* pointer after this to access b member?
没有。如果你这样做,那么程序的行为将是不确定的。