reinterpret_cast抛弃了资格赛

时间:2015-01-17 02:50:44

标签: 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);
}

似乎不允许reinterpret_cast并说

  

从'const void *)reinterpret_cast到Dialog *抛弃限定符

任何想法

2 个答案:

答案 0 :(得分:35)

正如Nick Strupat在评论中所述,

  

reinterpret_cast无法抛弃cv-qualifiers

因此,您可以同时使用reinterpret_castconst_cast

Dialog *dialog = const_cast<Dialog*>(reinterpret_cast<const Dialog *>(data));

答案 1 :(得分:6)

您还需要使用const_cast删除const限定符。此外,从void *投射可以使用static_cast,但不需要重新解释。例如:

Dialog const *dialog = static_cast<Dialog const *>(data);
Dialog *d2 = const_cast<Dialog *>(dialog);

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

我建议重新考虑ProgressBar的界面以避免需要这个演员表。