我们来看看代码。
extern "C" {
#include "pod-struct-T.h"
#include "malloc-and-initialize-one-T.h"
}
struct TCpp : T
{
TCpp()
{
T* ptr_t = malloc_and_initialize_one_T();
T* this_t = static_cast<T*>(this);
std::memcpy(this_t, ptr_t, sizeof(T));
free(ptr_t);
}
};
在这段代码中,有多少个UB(对于C++03和C++11;或者对于C++20,如果它的内存模型重新审视后有变化的话),或者这样做: memcpy
是就好了?如果是UB,至少在主要的编译器中是可移植的吗?(gcc, clang, intel等)。
免责声明: 是的,我知道......,它很丑陋,但不要问我为什么要这样做。
这个规则很不明确。[basic. types]3 (强调是后加的,脚注省略)。
对于任何可琐碎复制的类型
T
,如果有两个指针指向T
指明T
对象obj1
和obj2
, 其中既不obj1
也不obj2
是一个潜在的重叠子对象。,如果基本字节([intro.memory])构成了obj1
被复制到obj2
,obj2
随后应保持与obj1
.
基类子对象是潜在的重叠子对象。 由此可见,标准并没有定义如果你的对象是 memcpy
变成一个基类子对象。
简单赋值有什么不好?