cppreference & dagger; заявляет, что:
Объекты с тривиальными конструкторами по умолчанию могут быть созданы с помощью
reinterpret_cast
на любом подходящем выровненном хранилище, например. на память, выделенную с помощьюstd::malloc
.
Это означает, что следующий код является корректным:
struct X { int x; };
alignas(X) char buffer[sizeof(X)]; // (A)
reinterpret_cast<X*>(buffer)->x = 42; // (B)
Следующие три вопроса:
- Правильно ли это цитата?
- Если да, в какой момент начинается время жизни
X
? Если в строке(B)
, является ли это литой, которая считается приобретением памяти? Если в строке(A)
, если бы существовала ветвь между(A)
и(B)
, которая условно построилаX
или какой-либо другой модуль,Y
? - Что-то меняется между С++ 11 и С++ 1z в этом отношении?
& dagger; Обратите внимание, что это старая ссылка. Формулировка была изменена в ответ на этот вопрос. Теперь он гласит:
Однако, в отличие от C, объекты с тривиальными конструкторами по умолчанию не могут быть созданы путем простого переинтерпретации подходящего выравнивания хранилища, такого как память, выделенная с помощью
std::malloc
: place-new требуется для формального введения нового объекта и предотвращения потенциальных undefined поведение.