在什么条件下std::memcpy从一个对象复制到另一个对象是安全的?
例如,必须满足什么条件才能T保证以下安全src:dest
template <typename T>
void copy_bytewise(T& dest, const T& src) {
std::memcpy(&dest, &src, sizeof(T));
}
我们唯一可以假设src的dest是它们不重叠1。特别是其中之一src或dest可能是对成员或基类的引用。
我对引用标准的答案很感兴趣,但是如果这与通常的做法不同(例如,来自 Itanium 的事实上的 C++ ABI),我也想知道。
请注意,T满足TriviallyCopyable (TC) 概念是不够的,如本例所示。base是 TC 但不是 memcpy 安全的(由于对派生类的成员重复使用填充)。
如果单独存在任何T充分(且不一定是必要)的条件,而不需要src和dest(通常不能静态确定)的条件,我特别感兴趣。
1具体来说,我的假设是,如果它们确实T重叠,那么在与 for相同的条件下,它们仍然可以安全地复制std::memcpy,但可以std::memmove改为使用。如果假设不正确,它可能是答案的一部分。