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

时间:2011-02-18 21:59:59

标签: c++ qt

你可以使用static_cast向/从任何指向T的指针转换为/从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;
}

2 个答案:

答案 0 :(得分:2)

坦率地说,我也从未弄明白。 void **结构以相同的方式创建,只需将int*转换为void*,然后在另一侧执行此奇怪的转换。据我所知,static_cast不仅会好起来,还会更好。

你会发现像Qt这样的大型项目中有很多可疑的代码。有时候会因为没有人想要通过改变它来解决问题,或者只是坚持下去。

答案 1 :(得分:1)

这有点旧,但我不同意共识。您应该无法使用static_cast从任何类型转换为void*,只能使用reinterpret_caststatic_cast保留用于兼容的类型,执行一些编译时检查(即派生类,它们之间的数字类型)。

从此链接MSDN

dynamic_cast      Used for conversion of polymorphic types.
static_cast       Used for conversion of nonpolymorphic types.
const_cast        Used to remove the const, volatile, and __unaligned attributes.
reinterpret_cast  Used for simple reinterpretation of bits.