c++ - 是否允许使用偏移量将内存复制到普通的可复制类型?
问题描述
我有两种类型:
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 琐碎的可复制类型实际上是明确定义的行为)?
解决方案
推荐阅读
- excel - 如何使用 Sub 填充(动态)数组的值
- symfony - 使用 BrowserKit/Mink 下载文件
- python - 如果应用版本低于 1.5.5,则跳过 Python 测试
- href - Href onclick 动作在新窗口中打开
- c++ - QAbstractTableModel::header 数据和 QML TableView
- node.js - 如何将 listObjectsV2 作为 json 返回
- android - Firebase 用户更改电子邮件或电话号码
- c# - C# GroupBy 麻烦
- .htaccess - 如何忽略/重定向与某个字符串匹配的所有 URL
- excel - 如果块无法识别 VBA(循环通过可见行)