web-dev-qa-db-ja.com

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許可されていないようで、言う

reconpret_castを 'const void *)からDialog *に変更して修飾子をキャストします

何か案が

32
Seb

Nick Strupatがコメントで述べたように、

reinterpret_castはcv修飾子を捨てることができません

したがって、reinterpret_castおよびconst_cast一緒に。

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

const修飾子を削除するには、const_castも使用する必要があります。また、void *からのキャストではstatic_castを使用できます。再解釈する必要はありません。例えば:

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

ただし、Dialogが実際にconstオブジェクトではないことを確認してください。 constオブジェクトを変更しようとすると(おそらくsetValueがこれを行います)、未定義の動作が発生します。

このキャストが不要になるのを避けるために、ProgressBarへのインターフェイスを再考することをお勧めします。

6
M.M