У меня есть два типа:
struct A
{
std::uint64_t lhs;
std::uint64_t rhs;
A(A const&) { ... };
};
struct B
{
std::uint32_t a;
std::uint16_t b;
std::uint16_t c;
std::uint8_t d[8];
};
Я хочу преобразовать объект типа A
в объект типа B
. Строго говоря, A
является , а не тривиально копируемым, потому что он имеет определяемый пользователем конструктор копирования. Это означает, что я не могу безопасно memcpy весь объект, как
std::memcpy(&b, &a, sizeof(a));
, потому что поведение memcpy не определено для нетривиально копируемых типов. Из-за этого я хочу скопировать A::lhs
и A::rhs
отдельно в b
, но для этого я должен сместить указатель на b
:
std::memcpy(&b, &a.lhs, sizeof(a.lhs));
std::memcpy(reinterpret_cast<unsigned char*>(&b) + sizeof(a.lhs), &a.rhs, sizeof(a.rhs));
Это хорошо определенное поведение (при условии, что memcpying тривиальных копируемых типов на самом деле хорошо определенное поведение)?