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保持不变?
t如果T是可简单复制的类型,并且t不是潜在重叠的子对象,则保证的值保持不变。最新草案的标准报价:
[基本类型]
对于任何可简单复制类型 T 的对象(除了潜在重叠的子对象),无论该对象是否持有 T 类型的有效值,构成该对象的底层字节([intro.memory])都可以复制到char、unsigned char 或 std?::?byte ([cstddef.syn]) 的数组。37如果该数组的内容被复制回对象,则该对象随后应保持其原始值。
37) 例如,通过使用库函数([headers])std?::?memcpy 或 std?::?memmove。
事实上,该标准有一个几乎相同的例子:
[ 例子:
Run Code Online (Sandbox Code Playgroud)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— 结束示例 ]