在C ++的任何版本中,是否明确定义了并集的使用?

问题描述 投票:0回答:1

考虑一个具有更改的“活动成员”的简单联合:

union U {
  int i;
  char *p;
};

U u = { 1 };
u.p = 0;

是否存在可以正确定义此处发生情况的C ++标准的任何修订版

尤其是u.p的语义是什么?在编译时是左值,但是在运行时其评估指的是什么?

分配给它的指针对象在u中可以存在吗?

对象是否可以在生命周期开始之前就存在?

两个标量对象(不同类型)是否可以同时存在于同一地址

c++ language-lawyer unions lvalue object-lifetime
1个回答
0
投票

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类型的对象;不执行初始化,并且其生存期的开始在左右操作数的值计算之后和赋值之前进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.