Почему Qt использует reinterpret_cast вместо static_cast для void *? - PullRequest
4 голосов
/ 19 февраля 2011

Вы можете привести к / из любого указателя на T в / из void * с помощью static_cast, почему 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 ]

2 голосов
/ 19 февраля 2011

Честно говоря, я так и не смог понять это.Структура void ** создается таким же образом, просто приводит int* к void*, а затем выполняет это странное приведение с другой стороны.Насколько я могу судить, static_cast не только был бы в порядке, но и лучше.

Вы обнаружите, что в больших проектах типа Qt много сомнительного кодаИногда материал проскальзывает в обзоре или просто застревает, потому что никто не хочет проходить через его изменение.

1 голос
/ 23 мая 2011

Это немного устарело, но я бы не согласился с консенсусом.Вы не должны иметь возможность использовать 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...