首页 > 解决方案 > 是否允许使用偏移量将内存复制到普通的可复制类型?

问题描述

我有两种类型:

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::lhsA::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 琐碎的可复制类型实际上是明确定义的行为)?

标签: c++c++17language-lawyer

解决方案


推荐阅读