你可以使用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;
}
答案 0 :(得分:2)
void **
结构以相同的方式创建,只需将int*
转换为void*
,然后在另一侧执行此奇怪的转换。据我所知,static_cast不仅会好起来,还会更好。
你会发现像Qt这样的大型项目中有很多可疑的代码。有时候会因为没有人想要通过改变它来解决问题,或者只是坚持下去。
答案 1 :(得分:1)
这有点旧,但我不同意共识。您应该无法使用static_cast
从任何类型转换为void*
,只能使用reinterpret_cast
。 static_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.