【发布时间】:2017-11-07 22:19:42
【问题描述】:
是什么让工会成员活跃起来?
我已经阅读了 C++14 标准的第 9.5 章(关于联合的那一章),但我还没有找到一个明确的答案来说明什么使联合成员处于活动状态。
有个说明:
一般来说,必须使用显式析构函数调用和放置 new 运算符来更改工会的活跃成员。
例如,
union U {
int i;
short s;
} u;
new(&u.i) int(42);
好的,placement new 会更改活动成员,很明显。但我们通常不会在使用带有普通构造函数的类型时使用placement new。
operator= 是否会在没有 UB 的情况下更改活动成员?
u.i = 42;
这里,operator= 调用了一个未构造的对象。定义好了吗?
这个怎么样?
struct A {
int i0;
int i1;
};
union U {
A a;
short s;
} u;
是什么让a 成为u 的活跃成员? i0 & i1 都设置够了吗?
u.a.i0 = 42;
u.a.i1 = 99;
如果我写怎么办:
u.a.i0 = 42; // supposedly this doesn't change the active member to a, as i1 isn't set
int x = u.a.i0; // is it fine to read from a.i0? a is not an active member supposedly
u.a.i0 = 42;之后,活跃成员没有改成a(我想),所以是UB做int x = u.a.i0;吗?
C++17 是否改进了对活跃成员的描述?
【问题讨论】:
-
外行定义是这是最后写入的元素。但我在标准中找不到任何证据。
-
这是在C++17中修复的,在[class.union]/5中更详细地描述了切换活动成员的过程
-
@IgorTandetnik,您的评论实际上就是一个答案。
-
@SergeyA 好吧,这个问题专门针对 C++14。我没有答案。
标签: c++ c++14 language-lawyer c++17 unions