是否允许将类实例对象从一个位置移动到另一个位置(例如,使用std::memcpy
或std::memove
?假设源位置和目标位置具有相同的对齐方式。然后转换目标将“object”放入源对象的类型并调用它.C ++ 11标准的哪一部分禁止这个?
答案 0 :(得分:7)
您应该考虑C ++ 11提供的模板is_trivially_copyable
,它有助于了解memcpy
给定类型是否安全。如果值为false
,则结果未定义。
答案 1 :(得分:5)
只要它们是is_trivially_copyable,就是安全的。
§3.9.2
对于普通可复制类型T 的任何对象(基类子对象除外),无论对象是否包含类型T的有效值,构成该对象的基础字节(1.7) object可以复制到char或unsigned char数组中.40如果将char或unsigned char数组的内容复制回对象,则该对象应随后保持其原始值。
#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
§3.9.3
对于任何平凡可复制类型T ,如果指向T的两个指针指向不同的T对象obj1和obj2,其中obj1和obj2都不是基类子对象,如果是基础字节(1.7)将obj1复制到obj2,41中obj2随后应保持与obj1相同的值。 [例如:
T* t1p;
T* t2p;
// provided that t2p points to an initialized object ...
std::memcpy(t1p, t2p, sizeof(T));
// at this point, every subobject of trivially copyable type in *t1p contains
// the same value as the corresponding subobject in *t2p