Вопрос про динамический тип в C++
Меня интересует следующий вопрос.
В языке C есть понятие эффективного типа. Это понятие обозначает тип объекта, который где-либо размещен.
Например:
int i = 1;
float f = 2;
// sizeof(int) == sizeof(float)
// Допустим, что эти типы также имеют одинаковые требования к выравниванию.
void* data = malloc(4); // В данный момент объект (или память), на который указывает data, не имеет эффективного типа.
memcpy(data, &i, sizeof(int));// Теперь объект (или память), на который указывает data, имеет эффективный тип int.
float* pf1 = data;// Предположительно, возникновение неопределенного поведения, эффективные типы не совпадают.
*f1 = 3.14f;// Гарантированное возникновение неопределенного поведения, эффективные типы не совпадают.
memcpy(data, &f, sizeof(float);// data меняет эффективный тип с int на float.
float *pf2 = data;// Позволено.
*pf2 = 3.1415.f;// Позволено.
Насколько мне известно, в языке C++ нет понятия эффективного типа, но есть понятие динамического типа. Скажите, пожалуйста, действительно ли Стандарт требует размещения New или Placement New для того, чтобы можно было безопасно работать с бестиповым участком памяти, который, например, был получен из malloc()?