有没有一种安全的方法可以在 C++ 中将 void* 转换为 class 指针

Is there a safe way to cast void* to class pointer in C++

我正在使用 C 库,并且正在将“用户指针”传递给它。当我想获取用户指针时,库 return 将其设置为 void*。我目前正在使用 static_cast 来取消引用原始指针的成员。

所以我的问题是:有没有办法检查 static_cast 是否成功?

据我所知,static_cast 不会 return a nullptr 失败,而是,如果我尝试取消引用生成的失败指针,它将是 UB 和可能会使程序崩溃...

是的,static_cast在这里是正确的。

假设 void* 值仅在 C 库内部复制,如果将其转换为指针,static_cast 将 return 指向传递对象的原始指针值与原来相同的类型。

在某些情况下,您也可以转换为不同的类型,规则是 reinterpret_cast 的规则(它只是通过两个 static_castvoid* 中间转换)。

如果您将其转换为这些规则不允许的任何类型,例如不相关的 class 类型,尝试通过指针访问对象将导致未定义的行为。没有办法检测到这个错误。你需要注意自己正确地做。

my question is: is there a way to check if the static_cast succeeded?

没有。它要么是正确的,要么你的程序会有 未定义的行为

As far as I know static_cast will not return a nullptr on failure, but rather, if I attempt to de-reference the resulting failed pointer it would be UB

是的,正是这样。因此,在使用 static_cast 时,您必须确保 void* 实际上指向您要强制转换的类型的对象(或者是合法的向上或向下强制转换)。