reinterpret_cast создание тривиально конструируемого объекта по умолчанию
cppreference† говорится, что:
Объекты с тривиальными конструкторами по умолчанию могут быть созданы с помощью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
?Что-нибудь меняется в этом отношении между C ++ 11 и C ++ 1z?†Обратите внимание, что это старая ссылка. Формулировка была изменена в ответ на этот вопрос. Теперь оно гласит:
Однако, в отличие от C, объекты с тривиальными конструкторами по умолчанию не могут быть созданы путем простой интерпретации надлежащим образом выровненного хранилища, такого как память, выделеннаяstd::malloc
: location-new требуется, чтобы формально представить новый объект и избежать потенциально неопределенного поведения.