为什么 Qt 对 void* 使用 reinterpret_cast 而不是 static_cast?

Gui*_*e07 5 c++ qt

您可以使用 static_cast 将任何指向 T 的指针转换为 void* 或从 void* 转换,为什么 Qt 使用 reinterpret_cast?

int SOME_OBJECT::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QMainWindow::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        // Why reinterpret_cast here??
        case 0: on_tabWidget_tabCloseRequested((*reinterpret_cast< int(*)>(_a[1]))); break;
        default: ;
        }
        _id -= 1;
    }
    return _id;
}
Run Code Online (Sandbox Code Playgroud)

Edw*_*nge 2

坦白说,我也一直无法弄清楚。该void **结构的创建方式相同,只需转换一个int*to void*,然后在另一侧执行这个奇怪的转换。据我所知, static_cast 不仅可以,而且会更好。

您会发现像 Qt 这样的大型项目中有很多有问题的代码。有时,某些东西会漏掉审查或只是保留下来,因为没有人愿意经历更改它的麻烦。

  • 意识到 Qt 是在我们今天所知的“现代 C++”真正出现之前创建的,所以他们可能真的不知道更多。返回并重新实现框架(并且不破坏现有应用程序)以使用问​​题较少的代码的成本太高(就时间和人力而言),特别是因为 Qt 代码几乎总是依赖于“moc”工具。 (4认同)