reinterpret_cast抛弃了资格赛

Seb*_*Seb 32 c++ reinterpret-cast

我在重新解释变量时添加了一个问题,我不知道为什么......

int ProgressBar(const uint64_t data_sent, const uint64_t data_total, void const * const data) {
    Dialog *dialog = reinterpret_cast<Dialog *>(data);
    dialog->setValue((data_sent * 100) / data_total);
}
Run Code Online (Sandbox Code Playgroud)

reinterpret_cast似乎不允许,说

从'const void*)到Dialog*的reinterpret_cast抛弃了限定词

任何的想法

Pra*_*ari 38

正如Nick Strupat在评论中所述,

reinterpret_cast无法抛弃cv-qualifiers

所以,你可以使用reinterpret_castconst_cast在一起.

Dialog *dialog = const_cast<Dialog*>(reinterpret_cast<const Dialog *>(data));
Run Code Online (Sandbox Code Playgroud)


M.M*_*M.M 6

您还需要使用a const_cast来删除const限定符.另外,铸造void *可以使用static_cast,它不需要重新解释.例如:

Dialog const *dialog = static_cast<Dialog const *>(data);
Dialog *d2 = const_cast<Dialog *>(dialog);
Run Code Online (Sandbox Code Playgroud)

但是,请确保Dialog实际上不是const对象; 试图修改一个const对象(大概是setValue是这样做)会导致未定义的行为.

我建议重新考虑接口,ProgressBar以避免需要这个演员.