byte*
char*
unsigned char*
但我没有在列表中看到void*
,这是一个疏忽吗?我的使用情况需要用reinterpret_cast
从int**
转换为void*
。最终我会将void*
转换回int**
。
byte*
char*
unsigned char*
但我没有在列表中看到void*
,这是一个疏忽吗?我的使用情况需要用reinterpret_cast
从int**
转换为void*
。最终我会将void*
转换回int**
。
reinterpret_cast
一起使用的唯一类型。在将对象指针转换为另一个对象指针类型的情况下,未能满足严格别名规则的要求意味着您无法安全地引用结果。但是您仍然可以安全地将结果指针强制转换回原始类型,并将结果用作原始指针。reinterpret_cast
,cppreference 上的相关部分如下:reinterpret_cast
结果的方法:指向 cv
void
或对象类型的指针类型称为 对象指针类型。
不过,您不需要使用 reinterpret_cast
。每个指向非 cv 限定的指向类型的对象指针类型都可以隐式转换为 void*
,而反向转换可以使用 static_cast
。
int **
转换为void *
,我相信这确实需要一个reinterpret_cast
? - Jonathan Meeint *
的指针”就是指向CV未限定对象类型的指针。 - cpplearnervoid*
到int**
的转换需要一个reinterpret_cast
。你同意这个吗?我盗用了这个答案中的例子来演示:https://ideone.com/G4zuwd 除非你知道我不知道的东西,否则我需要一个reinterpret_cast
来分配ptr
,对吧? - Jonathan Mee将指向一种类型的指针转换为指向不同类型(包括void)的指针始终是合法的,因此如果T是一种类型,则以下C++代码是合法的:
最初的回答:在C++中,将指向一种类型的指针转换为指向另一种类型(包括void)的指针是合法的。因此,如果T是一种类型,下面的代码是合法的:
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注意到它。当您提到字节和字符是唯一合法类型时,只是因为仅对这些类型的转换后的指针进行解引用才是合法的。这里不包括当将对象指针类型的prvalue v转换为对象指针类型“指向cv T”的结果是
static_cast<cv T*>(static_cast<cv void*>(v))
。
void
,因为您永远无法解引用void *
。
标准保证第一个是标准(读作隐式)转换:..我正在从int **转换为void*。最终我将从void*转换回int**。
所以这总是合法的:对象类型T的“指向cv T”的指针类型的prvalue可以转换为类型“指向cv void”的prvalue。指针值(6.9.2)由此转换不变。
int **i = ...;
void *v = i;
对于反向转换,标准规定(在static_cast
段落中):
可以将类型为“指向cv1 void”的prvalue转换为类型为“指向cv2 T”的prvalue,
因此这也是合法的。
“prvalue”是C++中的一个概念,表示纯右值(pure rvalue),即不可修改的临时对象。cv1和cv2分别代表两个类型的常量性和易变性。
int **j = static_cast<int **>(v);
j == i
。static_cast
。任何对象指针类型都可以隐式转换为 void*
(具有相同的 cv 限定符)。只有在将 void*
强制转换回特定类型的对象指针时才需要使用 static_cast
... - Michael Kenzelint **
转换为void *
,然后再转回来,我相信这确实需要使用reinterpret_cast
? - Jonathan Mee
reinterpret_cast
将指针转换为void*
。https://godbolt.org/z/-eIfjl - Max Langhof