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 поведение.