struct Something
{
int a;
int b;
Something(char* buffer)
{
memcpy(this, buffer, sizeof(Something));
};
};
Run Code Online (Sandbox Code Playgroud)
这合法吗?安全?对我来说它看起来很好,但我不确定C++标准是否以某种方式禁止它.
...因为在我添加构造函数之后它不再是 POD 类型。
这不是事实(只是假新闻;-))。添加构造函数不会更改structs POD 类型状态。
您还可以使用以下命令轻松检查static_assert:
static_assert( "Something must be a POD type!",std::is_pod(Something)::value);
Run Code Online (Sandbox Code Playgroud)
这合法吗?
我不确定。取决于上下文。在你的系统中,它可以正常工作并编译,不会出现预期的错误或警告
安全的?
当然不是。
它以各种方式调用未定义的行为。
this可能不仅仅包含数据成员。也许有诸如 vtable 之类的东西。您应该注意,任何类型reinterpret_cast(即 c 风格转换)都会在某种程度上给您带来未定义的行为。您需要 100% 知道自己在做什么,我建议每次使用此类构造时都检查发出的程序集输出和内存布局。