考虑以下代码:
void **v_dptr(nullptr);
int **i_dptr = static_cast<int**>(v_dptr);
上面的示例产生以下编译错误:
LIVE DEMO
我知道将
void
指针转换为任何其他指针类型的正确方法是使用static_cast
。但是,您不能static_cast
一个双void
指针指向另一个其他类型的双指针。问:
static_cast
一个双void
指针? void
指针的正确方法是什么? 最佳答案
当您拥有一个void*
并将其转换为int*
时,可能会或可能不会进行一些数学/宽度调整来创建适当类型的实例,而static_cast<>
将准备进行此操作。当您只有一个指向void*
的指针而想要一个指向int*
的指针时,static_cast<>
对指向的void*
对象没有写权限;不能随意调整它以确保它是有效的int*
,以便static_cast<>
可以成功并返回实际上可以用于访问有效int*
的指针。在某些体系结构上,这可能并不重要,但如果标准允许这样做,则移植时代码可能会中断。 (请记住,期望static_cast<>
为使用int*
初始化的static_cast<int*>(the_void_ptr)
安排一些额外的内存是不合理的-不仅会产生意外的开销,而且还需要在特定于线程的内存中或动态分配并以某种方式发布了,实际上最终比较指针值的所有方式的代码都会中断。)
如果您想强制解决问题,并向编译器保证两种类型的宽度相同,并且无需进行数学调整等。-您可以使用reinterpret_cast<>
对其进行处理,使其清楚地表明您接受不确定的风险行为。