[class.prop] /(3.7)似乎与[class.prop] /(3.7.3)矛盾。我想念什么?

时间:2020-09-19 21:07:16

标签: c++ language-lawyer

如果满足以下条件,则S类为标准布局类:

[class.prop]/(3.7)

  • 没有作为基本类的类型 M (S)的元素,其中对于任何类型X, M (X )的定义如下。 102 [注意: M (X)是所有非基类子对象的类型的集合 可能在X中的偏移量为零。—尾注]

从上面突出显示的句子中,我们得出结论,如果S是联合,则 M(S)为空,这仅仅是因为联合没有基类。对我来说,这与下面的[class.prop] /(3.7.3)矛盾。

[class.prop]/(3.7.3)

  • 如果X是联合类型,则集合 M (X)是所有 M (U i < / sub>)和包含所有U i 的集合,其中每个U i 是< em> i th X的非静态数据成员。

1 个答案:

答案 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”偏移。