首页 文章

C 14中标准布局类的定义

提问于
浏览
5

标准布局类在C14的[class] / 7中定义,如下所示(重点是我的):

标准布局类是一个类:

  • (7.1) - 没有类型为非标准布局类(或此类类型的数组)或引用的非静态数据成员,

  • (7.2) - 没有虚函数(10.3),没有虚基类(10.1),

  • (7.3) - 对所有非静态数据成员具有相同的访问控制(第11条),

  • (7.4) - 没有非标准布局基类,

  • (7.5) - 在大多数派生类 and 中没有非静态数据成员,最多只有一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类,并且

  • (7.6) - 没有与第一个非静态数据成员相同类型的基类 .

我关注的是子弹(7.5):如何在最派生的类中拥有 no 非静态数据成员,同时有一个基类具有非静态数据成员?

换句话说,不是基类的非静态数据成员,也是最派生类的非静态数据成员?

1 回答

  • 8

    是的,这是C 14中的缺陷,特别是CWG 1813 . 虽然可以通过阅读"non-static data members"来仅修复直接(非继承)非静态数据成员(在其他地方可能是必需的)来修复它,但所选择的修复方法是用以下代码替换您发现有问题的语言:

    标准布局类是一个类:[...]具有类中的所有非静态数据成员和位字段及其基类首先在同一个类中声明,[...]

    为了做到这一点,这有点棘手;虽然 [class.derived] 具有以下内容,但对将继承成员视为派生类成员的想法存在一些阻力:

    [...]除非在派生类中重新声明,否则基类的成员也被视为派生类的成员 . 除了构造函数之外的基类的成员被称为由派生类继承 . [...]

    尽管如此,直接和继承非静态数据成员的许多地方都要考虑专门调用继承的数据成员,例如 [class] (在CWG 1672的决议之后):

    8.6 - 聚合或联合类型,包括其元素或非静态数据成员中的上述类型之一(递归地,包括子聚合或包含联合的元素或非静态数据成员),

    或者在 [basic.lval]

    7.8 - 如果X是非联合类类型,如果X没有(可能是继承的(第10条))非静态数据成员,则集合M(X)为空; [...]

    同时,在许多地方,“成员”必须被解读为仅指直接成员才有意义;首先,只查看非静态数据成员(不是成员函数),[expr.rel] /3.2,[expr.const] /5.1,[dcl.constexpr] /4.6,[class.mem] / 17, / 19,[special] / 5,[class.ctor] /4.3,/4.4,/ 4.10,/ 4.12,[class.dtor] /5.6, [class.base.init] / 2,/ 13.3,[class . 复制] /12.2,/ 12.4,/ 18.2,/ 25.2,/ 25.4,/ 26.3,/ 27,[except.spec] /15.1.1.1,/15.2,/15.3是“非静态数据成员”可以使用的所有地方或者应该有“直接”前缀 .

    另一方面,在某些地方(例如在修订的[class]或[class.copy] /23.2-23.3,/ 28)中,“成员”被隐含地包含在继承的成员中,所以它有点混乱 .

相关问题