繁体   English   中英

C ++中标准布局类的定义14

[英]Definition of standard-layout class in C++14

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

标准布局类是一个类:

  • (7.1) - 没有类型为非标准布局类(或此类类型的数组)或引用的非静态数据成员,
  • (7.2) - 没有虚函数(10.3),没有虚基类(10.1),
  • (7.3) - 对所有非静态数据成员具有相同的访问控制(第11条),
  • (7.4) - 没有非标准布局基类,
  • (7.5) - 在大多数派生类中没有非静态数据成员, 并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
  • (7.6) - 没有与第一个非静态数据成员相同类型的基类。

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

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

是的,这是C ++ 14中的一个缺陷,特别是CWG 1813 虽然可以通过读取“非静态数据成员”来仅修复直接 (非继承)非静态数据成员(在其他地方可能是必要的)来修复它,但所选择的修复方法是替换您发现的有问题的语言。下列:

标准布局类是一个类:[...]

  • 该类中的所有非静态数据成员和位字段及其基类首先在同一个类中声明,[...]

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

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

尽管如此,许多直接和继承的非静态数据成员都被认为是专门调用继承数据成员的地方,例如也在[类]中 (在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)中,“成员”被隐含地包含在继承成员中,所以它有点混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM