【发布时间】:2020-01-12 15:06:56
【问题描述】:
在当前版本的 C++ 标准草案中,[basic.life]/1 声明:
对象或引用的生命周期是 对象或参考。据说一个变量有空的初始化 如果它是默认初始化的,并且如果它是类类型或 (可能是多维的)数组,该类类型具有 微不足道的默认构造函数。 T 类型对象的生命周期 开始时间:
获得类型 T 的正确对齐和大小的存储,并且
它的初始化(如果有的话)已经完成(包括 vacuous 初始化)([dcl.init]),
除非对象是联合 成员或其子对象,它的生命周期仅在该联合时才开始 member 是联合中的初始化成员([dcl.init.aggr], [class.base.init]),或如 [class.union] 中所述。 [...]
从那段中我了解到,工会成员开始其生命周期的唯一方式是:
- 该成员“是联合中的已初始化成员”(例如,如果它在
mem-initializer中被引用),或者 - [class.union] 中提到的其他方式
然而,[class.union] 中唯一指定联合成员如何开始其生命周期的规范段落是[class.union]/5(但它仅适用于特定类型,即non-class 、non-array 或 class 类型以及未删除的 trivial 构造函数,或此类类型的数组)。
下一段[class.union]/6(包括注释和示例,因此不包含规范文本)描述了一种通过使用@987654329 更改联合的活动成员的方法@,比如new (&u.n) N;,在哪里
struct N { N() { /* non-trivial constructor */ } };
struct M { M() { /* non-trivial constructor */ } };
union
{
N n;
M m;
} u;
我的问题是在标准中的哪个位置指定new (&u.n) N; 开始u.n 的生命周期?
谢谢!
【问题讨论】:
-
你已经有了它:它的初始化(如果有的话)已经完成(包括空初始化)([dcl.init]),。 [dcl.init] 谈
new -
@NathanOliver [basic.life]/1 中强调的部分介绍了开始工会成员生命周期的附加条件。至少我是这么读的。
-
联合是核心 C++ 中另一个令人深感不安的领域:1)很长一段时间没有明确的联合规则; 2)“左值指的是对象”是一个普遍接受的比喻,即使在专家 C++ 圈子中也是如此;根据定义,分配工会成员是不正确的。 3)“左值引用对象”明确解释了为什么您不能取消引用空 ptr。 C++ 是一团糟!
标签: c++ initialization language-lawyer unions object-lifetime