如何将指向void对象的指针转换为类对象?
使用static_cast
进行转换。注意,只有当指针确实指向指定类型的对象时才能这样做;也就是说,指向void
的指针的值是从指向此类对象的指针中获得的。
thing * p = whatever(); // pointer to object
void * pv = p; // pointer to void
thing * p2 = static_cast<thing *>(pv); // pointer to the same object
如果你发现自己需要这样做,你可能需要重新考虑你的设计。你放弃了类型安全,使得编写无效代码变得容易:
something_else * q = static_cast<something_else *>(pv);
q->do_something(); // BOOM! undefined behaviour.
static_cast
用于撤销隐式转换,类指针到 void 指针的转换是一种隐式转换。 - Alok Savevoid *
强制转换为 X *
应该总是使用 reinterpret_cast
,因为这就是它的作用。但我现在知道我错了。 - Marcelo Cantosreinterpret_cast
最常用于将 X*
转换为 Y*
,其中 X
和 Y
都是原始类型,并通常对内存布局进行一些特定于机器的假设。即使您知道确切的架构,也很难以这种方式避免 UB。 - Karl Knechtelnullptr
还是损坏的指针? - Tomáš Zato