Я понял, что тонкости тривиальных типов на С++ нетривиальны для понимания и надеюсь, что кто-то может просветить меня следующим образом.
Данный тип T
, хранилище для T
, выделенное с помощью ::operator new(std::size_t)
или ::operator new[](std::size_t)
или std::aligned_storage
, и void * p
, указывающее на местоположение в этом хранилище, подходящим образом выровненное для T
, чтобы оно могло построим в точке p
:
- Если
std::is_trivially_default_constructible<T>::value
имеет значение, это код, вызывающий поведение undefined, когда код пропускает инициализациюT
вp
(т.е. с помощьюT * tPtr = new (p) T();
), прежде чем обратится к*p
какT
? Можно ли использоватьT * tPtr = static_cast<T *>(p);
вместо этого, не опасаясь поведения undefined в этом случае? - Если
std::is_trivially_destructible<T>::value
имеет значение, выполняется ли пропускT
при*p
(т.е. при вызовеtPtr->~T();
) поведение undefined? - Для любого типа
U
, для которого выполняетсяstd::is_trivially_assignable<T, U>::value
,std::memcpy(&t, &u, sizeof(U));
эквивалентноt = std::forward<U>(u);
(для любогоT
типаT
иU
типаU
), или это вызовет undefined поведение?