Реинтерпретация прямой памяти, по определению, означает работу с lvalues. Самый простой подход должен был бы сделать это, хотя гипсе к ссылочного типа
double d = reinterpret_cast<double &>(voidp);
Вы также можете сделать это с помощью указателя гипсе, как и другие ответы предложили, хотя он «перегружает» процедура с несколькими совершенно ненужными приложений оператора. Оба подхода эквивалентны, поскольку по определению reinterpret_cast
ссылочному типу reinterpret_cast<T &>(v)
эквивалентно версии указателя *reinterpret_cast<T *>(&v)
.
Однако вышеупомянутые подходы страдают от проблем с типом. Формально это делается просто незаконно. Вам не разрешено читать void *
объектов как double
объектов в C++.Прямая реинтерпретация памяти существует в C++ для повторной интерпретации объектов в виде массивов char
s, а не для произвольного типа, как указано выше. Даже если мы проигнорируем формальную проблему и придерживаемся чисто «практических» соображений, пытаясь прямо переосмыслить значение void *
, поскольку значение double
может привести к совершенно неожиданным и бессмысленным результатам в компиляторе, который следует за строгой сглаживающей семантикой при выполнении оптимизаций.
Лучшая идея может быть memcpy
void *
объекта к объекту double
double d;
assert(sizeof d == sizeof voidp); // <- a static assert would be even better
memcpy(&d, &voidp, sizeof d);
Кроме того, в C вы теперь разрешено использовать союзы для этой цели. Я не уверен, что официальное разрешение было сделано на C++, но оно, как правило, будет работать на практике.
Включите его в 'double *' – Kunal
'double d = * ((double *) voidp)'? – clcto
Почему вы хотите это сделать? В какой ситуации вы будете хранить 'double' в' void * '? –