为什么对于不能TriviallyCopyable的对象,std :: memcpy的行为将无法定义?
来自http://en.cppreference.com/w/cpp/string/byte/memcpy: 如果对象不是TriviallyCopyable(例如标量,数组,C兼容结构),则该行为是不确定的。 在我的工作中,std::memcpy很长时间以来,我们一直使用以下方法按位交换不可TriviallyCopyable的对象: void swapMemory(Entity* ePtr1, Entity* ePtr2) { static const int size = sizeof(Entity); char swapBuffer[size]; memcpy(swapBuffer, ePtr1, size); memcpy(ePtr1, ePtr2, size); memcpy(ePtr2, swapBuffer, size); } 从来没有任何问题。 我了解滥用std::memcpy非TriviallyCopyable对象并导致下游未定义行为是微不足道的。但是,我的问题是: std::memcpy与非TriviallyCopyable对象一起使用时,为什么自身的行为不确定?为什么标准认为有必要指定该标准? 更新 针对此帖子和该帖子的答案已修改了http://en.cppreference.com/w/cpp/string/byte/memcpy的内容。当前的描述是: 如果对象不是TriviallyCopyable(例如标量,数组,与C兼容的结构),则除非程序不依赖于目标对象的析构函数的影响(不是由memcpy)运行,否则行为是不确定的。目标对象(以结束,但不是以开头memcpy)是通过其他一些方式(例如,新放置)来启动的。 聚苯乙烯 @Cubbi的评论: @RSahu如果可以保证UB下游,它将使整个程序未定义。但我同意,在这种情况下似乎有可能绕过UB,并相应地修改了cppreference。