哪个演员使用; static_cast还是reinterpret_cast?

use*_*241 10 c++ casting

int i = 1000;
void *p = &i;

int *x = static_cast<int*>(p);
int *y = reinterpret_cast<int*>(p);
Run Code Online (Sandbox Code Playgroud)

哪个演员应该用来转换void*int*和为什么?

Ste*_*sop 14

static_cast只要你知道(通过你的程序设计)指出的东西真的是一个int.

static_cast旨在反转任何隐式转换.你转换为void*隐式,因此你可以(并且应该)转换回来,static_cast 如果你知道你真的只是扭转了早期的转换.

有了这个假设,没有任何东西被重新解释 - void是一个不完整的类型,意味着它没有值,所以在任何时候你都不会将存储的int值解释为"void"或将存储的"void value"解释为int.void*只是一种丑陋的说法,"我不知道这种类型,但我会将指针传递给其他人".

reinterpret_cast 如果你遗漏了一些细节,这些细节意味着你实际上可能正在使用类型以外的类型读取内存,并且要注意你的代码将具有有限的可移植性.

顺便说一下,void*在C++中以这种方式使用指针的原因并不是很多.C样式的回调接口通常可以替换为模板函数(对于任何类似于标准函数的东西qsort)或虚拟接口(对于任何类似于已注册的侦听器的东西).如果您的C++代码使用的是某些C API,那么您当然没有太多选择.