struct Something
{
int a;
int b;
Something(char* buffer)
{
memcpy(this, buffer, sizeof(Something));
};
};
这合法吗?安全?对我来说它看起来不错,但我不确定C ++标准是否以某种方式禁止它。
答案 0 :(得分:0)
...从我添加构造函数后它不再是POD类型这一事实。
那不是事实(只是假新闻;-))。添加构造函数不会更改struct
的POD类型状态。
您还可以使用static_assert
:
static_assert( "Something must be a POD type!",std::is_pod(Something)::value);
这合法吗?
我不太确定。取决于上下文。在你的工作和编译没有错误或警告,如预期的
安全?
当然不是。
它以各种方式调用未定义的行为。
this
可能不仅包含数据成员。也许有像vtable这样的东西。你应该注意,任何类型的reinterpret_cast
(即c式演员)都会在某种程度上给你未定义的行为。
您需要100%知道自己在做什么,并建议每次使用此类构造时检查发出的程序集输出和内存布局。
答案 1 :(得分:-8)
保证在没有错误消息的情况下成功编译。因此,根据定义,它是100%合法的。
在这种特殊情况下,它可以按预期工作。但是,如果一个结构使用虚函数,它会存储vptr,这个东西不起作用。例如,您可能稍后添加一个虚函数,构造函数将停止工作。所以不,这不安全。