将对象的字节复制到数组并再次返回是否安全

Bee*_*ope 5 c++ language-lawyer

将对象的字节复制到 的数组中unsigned char然后再次使用复制回来是否安全memcpy,并且它是否使对象保持不变?

也就是说,以下对 any 是安全的t

template <typename T>
void copy_back_and_forth(T& t) {
  unsigned char buf[sizeof(T)];
  std::memcpy(buf, &t, sizeof(T));
  std::memcpy(&t, buf, sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)

......它是否t保持不变?

eer*_*ika 6

t如果T是可简单复制的类型,并且t不是潜在重叠的子对象,则保证的值保持不变。最新草案的标准报价:

[基本类型]

对于任何可简单复制类型 T 的对象(除了潜在重叠的子对象),无论该对象是否持有 T 类型的有效值,构成该对象的底层字节([intro.memory])都可以复制到char、unsigned char 或 std?::?byte ([cstddef.syn]) 的数组。37如果该数组的内容被复制回对象,则该对象随后应保持其原始值。

37) 例如,通过使用库函数([headers])std?::?memcpy 或 std?::?memmove。

事实上,该标准有一个几乎相同的例子:

[ 例子:

constexpr std::size_t N = sizeof(T);
char buf[N];
T obj;                          // obj initialized to its original value
std::memcpy(buf, &obj, N);      // between these two calls to std?::?memcpy, obj might be modified
std::memcpy(&obj, buf, N);      // at this point, each subobject of obj of scalar type holds its original value
Run Code Online (Sandbox Code Playgroud)

— 结束示例 ]