【发布时间】:2019-12-30 09:32:50
【问题描述】:
我不太确定关于 memcpy 和 union 琐碎成员的标准引用。
考虑代码:
struct Test{
union
{
void(*function_p)(void*);
void(*function_p_c)(const void*);
};
Test(const Test &other)
{
using std::memcpy;
memcpy(&function_p, &other.function_p, sizeof(function_p)); //?
memcpy(&function_p_c, &other.function_p_c, sizeof(function_p_c)); //??
}
};
int main(void)
{
Test t1; t1.function_p = NULL; //let it be NULL for c++98 sake
Test t2(t1); // is it safe? does this set new active member of union?
return 0;
}
所以一个问题导致另一个问题:
上面的代码安全吗?还是第二个/第一个
memcpy的 UB 取决于哪个union成员用户已触摸?为两个成员都调用memcpy是不是有点矫枉过正?如果它不安全,那么我如何在没有一些 flag-of-active-union-member 的情况下实现复制构造函数?
【问题讨论】:
-
注意:我只是添加了
language-lawyer标签,这是这种问题的习惯。由于最多有五个标签,因此我选择了std来删除。 -
为什么?为什么不直接使用
=? -
使用指定的工会成员,你可以做一个
memcpy。 -
或者创建两个类
TestA和TestB,一个有一个成员function_p,另一个有function_p_c。 - 你说你想“没有一些活跃工会成员的旗帜”。如果你没有那种标志,你将如何在课堂的其他地方使用正确的函数指针? -
取决于联合内的类型,但在你的情况下,是的。
标签: c++ language-lawyer std unions standards-compliance