【发布时间】:2019-02-05 10:15:58
【问题描述】:
本题基于this
考虑以下几点:
struct Hdr { int type; };
struct A { Hdr h; };
union Big {
Hdr h;
A a;
};
并假设对于Big big,我们知道big.a 是工会的活跃成员。是否访问big.h.type未定义行为?
我认为确实是UB,基于:
... [ 注意:为了简化联合的使用,我们做了一个特殊的保证:如果一个标准布局联合包含多个标准布局结构,它们共享一个共同的初始序列([class.mem]),并且如果此标准布局联合类型的对象的非静态数据成员处于活动状态并且是标准布局结构之一,则允许检查任何标准布局结构成员的公共初始序列;见[class.mem]。 — 尾注 ]
我们有一个标准布局联合,它具有标准布局成员结构,但据了解,Hdr 和 A 的 common initial sequence 是空的,即使 A 的第一个数据成员类型为 @987654331 @。
我说得对吗,这是 UB ?如果不是,我误解了公共初始序列的哪一点,因此定义了访问big.h.type?
【问题讨论】:
-
你的引文似乎跟我说的相反。
-
@user4581301 是递归应用的通用初始序列吗?我的意思是,检查
big.a.h以寻找与big.h的共同序列? -
我认为你是对的。真可惜。我在定义中看不到递归。任何这样的话都是相当危险的。除非“第一”或“基础”具有非常规的含义(比如包括自己)。
-
@xeros 你的逻辑是正确的;我的不太好。这就是我讨厌这种语言律师的东西。我要把它扔到“UB,但几乎肯定会起作用”堆上。
-
@user4581301:我将最常见的初始序列问题描述为“标准的作者认为意图和目的足够清楚,标准是否以这种方式措辞并不重要至于实际授权这种支持。”不幸的是,将标准置于其从未设计为适合的语言律师水平已成为一种时尚,在声称此类行为的行为从未定义过的人与认为他们的行为的人之间产生了无法解决的冲突被普遍理解为定义...
标签: c++ language-lawyer union