我在看https://en.cppreference.com/w/cpp/language/reinterpret_cast时,发现它指定了我们可以始终转换为的合法类型:
byte*
char*
unsigned char*
但是我没有在列表中看到
void*
。这是疏忽吗?我的用例需要reinterpret_cast
,因为我是从int**
转换为void*
。最后,我将把void*
转换回int**
。 最佳答案
从一个类型的指针到另一个包含void的类型的指针总是合法的,因此,如果T是一个类型,则这是合法的C++:
T* x;
void *y = reinterpret_cast<void *>(x);
在现实世界中,从未使用过它,因为
void *
是一种特殊情况,并且您可以使用static_cast
获得相同的值:void *y = static_cast<void *>(x); // equivalent to previous reinterpret_cast
(实际上,上面的转换是隐式的,可以简单地写为
void *y = x;
-感谢Michael Kenzel的注意)更明确地说,该标准甚至在C++ 17的n4659草案中说8.2.10重新解释类型转换[expr.reinterpret.cast],第7节
当您将byte和char称为唯一合法类型时,仅对那些类型取消引用转换后的指针是合法的。这里不包括
void
,因为您永远都不能取消引用void *
。具体回答您的问题
该标准保证第一个是标准(隐式读取)转换:
因此,这始终是合法的:
int **i = ...;
void *v = i;
对于反向转换,标准说(在
static_cast
段中):所以这也是合法的
int **j = static_cast<int **>(v);
并且该标准确保
j == i
。关于c++ - 重新解释为空是合法的*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55728740/