考虑以下代码:

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<>对其进行处理,使其清楚地表明您接受不确定的风险行为。

    07-24 09:44
    查看更多