小编典典

何时使用 reinterpret_cast?

all

我对reinterpret_castvs的适用性有点困惑static_cast。从我读过的内容来看,一般规则是当类型可以在编译时解释时使用静态转换,因此这个词static。这也是
C++ 编译器在内部用于隐式转换的转换。

reinterpret_casts适用于两种场景:

  • 将整数类型转换为指针类型,反之亦然
  • 将一种指针类型转换为另一种。我得到的一般想法是这是不可移植的,应该避免。

我有点困惑的是我需要的一种用法,我从 C 调用 C,C 代码需要保留 C 对象,所以基本上它包含一个void*. 应该使用什么类型转换来在
thevoid *和 Class 类型之间进行转换?

我见过两者的用法static_castreinterpret_cast?虽然从我一直在阅读的内容来看,它似乎static更好,因为演员可以在编译时发生?虽然它说用于reinterpret_cast从一种指针类型转换为另一种?


阅读 221

收藏
2022-03-09

共1个答案

小编典典

C++ 标准保证以下内容:

static_cast指向和返回的指针会void*保留地址。也就是说,在下面,abc指向同一个地址:

int* a = new int();
void* b = static_cast<void*>(a);
int* c = static_cast<int*>(b);

reinterpret_cast仅保证如果您将指针转换为不同的类型,
然后将reinterpret_cast其返回到原始类型,您将获得原始值。所以在下面:

int* a = new int();
void* b = reinterpret_cast<void*>(a);
int* c = reinterpret_cast<int*>(b);

a并且c包含相同的值,但未b指定的值。(实际上,它通常包含与 and
相同的地址ac但标准中没有指定,并且在具有更复杂内存系统的机器上可能不是这样。)

对于从 的转换void*static_cast应该是首选。

2022-03-09