C++ [class.prop]/(3.7)似乎与[class.prop]/(3.7.3)相矛盾。我错过了什么?
类S是标准布局类,如果它: :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的非静态数据成员 我
- 没有类型集M(S)的元素作为基类,其中对于任何类型X,M(X)的定义如下。102 [注:M(X)是所有非基类子对象的类型集 这可能在X中为零偏移量。-结束注释]
- 如果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;};
)的成员,它不是标准布局。