C++ [class.prop]/(3.7)似乎与[class.prop]/(3.7.3)相矛盾。我错过了什么?

C++ [class.prop]/(3.7)似乎与[class.prop]/(3.7.3)相矛盾。我错过了什么?,c++,language-lawyer,C++,Language Lawyer,类S是标准布局类,如果它: : 没有类型集M(S)的元素作为基类,其中对于任何类型X,M(X)的定义如下。102 [注:M(X)是所有非基类子对象的类型集 这可能在X中为零偏移量。-结束注释] 从上面突出显示的句子中,我们得出结论,如果S是并集,那么M(S)是空的,这仅仅是因为并集没有基类。对我来说,这与下面的[class.prop]/(3.7.3)相矛盾 如果X是联合类型,则集合M(X)是所有M(Ui)和包含所有Ui的集合的联合,其中每个Ui是第i个Ui的类型 X的非静态数据成员 我

类S是标准布局类,如果它:

:

  • 没有类型集M(S)的元素作为基类,其中对于任何类型X,M(X)的定义如下。102 [注:M(X)是所有非基类子对象的类型集 这可能在X中为零偏移量。-结束注释]
从上面突出显示的句子中,我们得出结论,如果S是并集,那么M(S)是空的,这仅仅是因为并集没有基类。对我来说,这与下面的[class.prop]/(3.7.3)相矛盾

  • 如果X是联合类型,则集合M(X)是所有M(Ui)和包含所有Ui的集合的联合,其中每个Ui是第i个Ui的类型 X的非静态数据成员

我错了。请参阅颧倍体的答案

注意@GManNickG,我在GitHub中复制了zygoloid对我的问题的回答:

措辞是正确的。考虑:

struct A {};
union U { A a; };
struct B : A { U u; };
这里,B不是标准布局,因为M(B)包含A,B包含A 基类。M(B)定义为U加M(U),M(U)定义为 A

所以我们需要M(U)是非空的,以便M(B)正确地计算“集合” 可能为零的所有非基类子对象的类型 偏移量在“U”中,即使U本身不能有基类

M(S)
是一组类型的非基类子对象。您突出显示的句子绝不表示对于联合体
U
,M(U)必须为空。它说的是一个类
S
,它的基类类型为
B
,其中
B
也是
M(S)
(例如
类S:public B{B;};
)的成员,它不是标准布局。