tem*_*def 7 c++ language-lawyer
这纯粹是假设,但我不确定以下代码是否会导致根据C++规范的未定义行为.我想复制一个对象中的字节,通过用零覆盖来爆炸对象,然后将旧字节复制回来.我可以这样做而不会导致未定义的行为吗?
示例代码:
NonPODType o;
char bytes[sizeof(o)];
memcpy(bytes, &o, sizeof(o));
memset(&o, 0, sizeof(o));
memcpy(&o, bytes, sizeof(o));
Run Code Online (Sandbox Code Playgroud)
一般来说,没有.有一个明确的保证,这适用于§3.9/ 2上的平凡可复制类型,但对于其他类型没有这样的东西.
对于具有普通可复制类型的任何对象(基类子对象除外)
T,无论对象是否保持有效的类型值,构成对象T的基础字节(1.7)都可以复制到char或的数组中unsigned char.如果阵列的内容char或unsigned char将被复制回对象,该对象随后应保持其原始值.[ 例如:Run Code Online (Sandbox Code Playgroud)#define 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- 末端的例子 ]