C++ 使用std::memcpy在内存中移动对象

C++ 使用std::memcpy在内存中移动对象,c++,c++11,C++,C++11,是否允许将类实例对象从一个位置移动到另一个位置(例如,通过使用std::memcpy或std::memove)?假设源位置和目标位置具有相同的对齐方式。然后强制转换目标“对象”C++ C++ 11标准中的哪一部分禁止使用此方法?< p>您应该考虑C++ 11提供的模板,如果它对代码< MyCPy < /C> >给定类型,则是有用的。如果值是“代码> false ,则结果未定义。 < P>只要是,就安全。< /P> §3.9.2 对于普通可复制类型T的任何对象(基类子对象除外),无论该对象是否持有

是否允许将类实例对象从一个位置移动到另一个位置(例如,通过使用
std::memcpy
std::memove
)?假设源位置和目标位置具有相同的对齐方式。然后强制转换目标“对象”C++ C++ 11标准中的哪一部分禁止使用此方法?

< p>您应该考虑C++ 11提供的模板,如果它对代码< MyCPy < /C> >给定类型,则是有用的。如果值是“代码> false <代码>,则结果未定义。

< P>只要是,就安全。< /P> §3.9.2

对于普通可复制类型T的任何对象(基类子对象除外),无论该对象是否持有类型T的有效值,底层字节(1.7)组成对象的字符可以复制到字符或无符号字符数组中。40如果字符或无符号字符数组的内容被复制回对象中,则对象随后应保持其原始值

§3.9.3

对于任何普通可复制类型T,如果指向T的两个指针指向不同的T对象obj1和obj2,其中obj1和obj2都不是基类子对象,如果组成obj1的底层字节(1.7)复制到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

这是允许的,但可能会导致错误。我认为调用移动构造函数赋值运算符会是一个更好的解决方案。当然,但它可能不存在。它们可能不存在,这意味着不应该移动或复制对象。只有以这种方式编程时,它们才会存在。编译器将为大多数类型添加默认值。@user1095108:目的地必须与类型适当对齐。但这是一般要求,不是
memcpy
的特殊要求。
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