Что формулировка в стандарте C++ позволяет static_cast <non-void-type*> (malloc (N)); работать?

Насколько я понимаю формулировку в 5.2.9 Статических бросках, единственное время результат a void*- преобразование to-object-pointer позволяется, когда void* был результат обратного преобразования во-первых.

Всюду по стандарту существует набор ссылок на представление указателя и представление a void указатель, совпадающий с указателем a char указатель, и так далее, но это никогда, кажется, явно не говорит тот кастинг произвольного void урожаи указателя указатель на то же местоположение в памяти, с другим типом, во многом как трамбовка типа не определены где, не каламбуря назад к фактическому типу объекта.

Итак, в то время как malloc ясно возвращает адрес подходящей памяти и так далее, кажется, нет никакого способа на самом деле использовать его, портативно, насколько я видел.

7
задан 4 revs, 3 users 100% 7 November 2018 в 23:30
поделиться

1 ответ

Черновик стандарта 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 
3
ответ дан 7 December 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: