Я понял, что тонкости тривиальных типов на С++ нетривиальны для понимания и надеюсь, что кто-то может просветить меня следующим образом.
Данный тип 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 поведение?