考虑一个具有更改的“活动成员”的简单联合:
union U {
int i;
char *p;
};
U u = { 1 };
u.p = 0;
是否存在可以正确定义此处发生情况的C ++标准的任何修订版?
尤其是u.p
的语义是什么?在编译时是左值,但是在运行时其评估指的是什么?
分配给它的指针对象在u
中可以存在吗?
对象是否可以在生命周期开始之前就存在?
两个标量对象(不同类型)是否可以同时存在于同一地址?
u.p
指的是为寿命尚未开始的对象分配的存储,如[basic.life]/7所允许的:“在对象的生存期开始之前,但该对象将占用的存储已分配...任何引用原始对象的glvalue都可以使用,但只能以有限的方式使用。“
然后是一种特殊的魔术,通过该魔术,分配给工会成员可以开始对象的生命周期:
[[class.union]/5当赋值运算符的左操作数涉及指定联合成员的成员访问表达式([expr.ref])时,它可以开始该联合成员的生存期,如下所述...
对于
E1 = E2
形式的赋值表达式,对于每个元素X
,它都使用内置赋值运算符([expr.ass])或平凡的赋值运算符([class.copy.assign])。S(E1)
,如果在[basic.life]下对X
的修改将具有未定义的行为,则在指定存储中隐式创建X
类型的对象;不执行初始化,并且其生存期的开始在左右操作数的值计算之后和赋值之前进行排序。