Насколько я понимаю формулировку в 5.2.9 Статических бросках, единственное время результат a void*
- преобразование to-object-pointer позволяется, когда void*
был результат обратного преобразования во-первых.
Всюду по стандарту существует набор ссылок на представление указателя и представление a void
указатель, совпадающий с указателем a char
указатель, и так далее, но это никогда, кажется, явно не говорит тот кастинг произвольного void
урожаи указателя указатель на то же местоположение в памяти, с другим типом, во многом как трамбовка типа не определены где, не каламбуря назад к фактическому типу объекта.
Итак, в то время как malloc
ясно возвращает адрес подходящей памяти и так далее, кажется, нет никакого способа на самом деле использовать его, портативно, насколько я видел.
Черновик стандарта C ++ 0x в 5.2.9 / 13 содержит:
rvalue типа «указатель на cv1 void» может быть преобразовано в rvalue типа «указатель на cv2 T», где T - это тип объекта , а cv2 - это то же квалификация cv, что и {{ 1}} cv-qualification than, cv1. Значение нулевого указателя преобразуется в значение нулевого указателя целевого типа. Значение указателя типа на объект преобразуется в «указатель на cv void. ”И назад, возможно, с другой квалификацией , должны иметь исходное значение .
Но также обратите внимание, что приведение не обязательно приводит к действительному объекту:
std::string* p = static_cast<std::string*>(malloc(sizeof(*p)));
//*p not a valid object