Разрешено ли копирование со смещением в тривиальный копируемый тип? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть два типа:

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 тривиальных копируемых типов на самом деле хорошо определенное поведение)?

...