如果满足以下条件,则S类为标准布局类:
- 没有作为基本类的类型 M (S)的元素,其中对于任何类型X, M (X )的定义如下。 102 [注意: M (X)是所有非基类子对象的类型的集合 可能在X中的偏移量为零。—尾注]
从上面突出显示的句子中,我们得出结论,如果S是联合,则 M(S)为空,这仅仅是因为联合没有基类。对我来说,这与下面的[class.prop] /(3.7.3)矛盾。
- 如果X是联合类型,则集合 M (X)是所有 M (U i < / sub>)和包含所有U i 的集合,其中每个U i 是< em> i th X的非静态数据成员。
答案 0 :(得分:3)
我错了。参见合子here的答案。
在关注@GManNickG时,我在zygoloid的回答下复制了我在GitHub上发布的问题:
措辞是正确的。考虑:
struct A {}; union U { A a; }; struct B : A { U u; };
此处,B不是标准布局,因为M(B)包含A,而B具有A 基类。 M(B)定义为U加M(U),M(U)定义为 答:
因此,对于M(B),我们需要M(U)为非空,以正确计算“集合 可能为零的所有非基类子对象的类型 即使U本身不能具有基类,也可以使用“ U”偏移。