reinterpret_cast可以去除限定符。

47

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

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 *)' 到 'Dialog *' 的 reinterpret_cast 转换去除了限定符。

有任何想法吗?


6
reinterpret_cast 无法移除常量限定符。 - Nick Strupat
@Nick:你放在那里的最后一个“const”没有任何作用。 - Ben Voigt
3
嗯,你为什么要删除这里的“const”?那听起来不安全。 - templatetypedef
2个回答

67

正如Nick Strupat在评论中所说,

reinterpret_cast不能去除cv限定符。

因此,您可以一起使用reinterpret_castconst_cast

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

11

您还需要使用const_cast来去除const限定符。此外,从void *进行强制转换可以使用static_cast,而不需要reinterpret。例如:

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

但是,请确保对话框实际上不是一个const对象;试图修改常量对象(可能是setValue这样做)会导致未定义的行为。

我建议重新思考ProgressBar的接口,以避免需要进行此类型的强制转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接