A 标准布局class 在 C++14 中的 [class]/7 中定义,如下(重点是我的):
A 标准布局class 是一个类:
- (7.1) — 没有非标准布局类型的非静态数据成员
类(或此类类型的数组)或引用,
- (7.2) — 没有虚函数 (10.3) 也没有虚基类
(10.1),
- (7.3) — 对所有非静态具有相同的访问控制(第 11 条)
数据成员,
- (7.4) — 没有非标准布局基类,
- (7.5) — 要么在最派生的中没有非静态数据成员
班级and至多一个具有非静态数据成员的基类,或者具有
没有带有非静态数据成员的基类,并且
- (7.6) — 没有与第一个非静态类型相同的基类
数据成员。
我关心的是与项目符号(7.5)有关:如何可能no最底层派生类中是否有非静态数据成员,同时具有一个包含非静态数据成员的基类?
换句话说,基类的非静态数据成员不也是最派生类的非静态数据成员吗?
是的,这是 C++14 中的一个缺陷,具体来说CWG 1813 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1813。虽然可以通过读取“非静态数据成员”来修复仅引用direct(非继承的)非静态数据成员(在其他地方可能是必需的),所选择的修复是用以下内容替换您发现有问题的语言:
标准布局类是这样的类:[...]
- 具有类及其基类中的所有非静态数据成员和位字段,首先在同一个类中声明,[...]
要做到这一点有点棘手;对于将继承的成员视为派生类的成员的想法存在一些阻力,尽管[类.派生] has:
[...] 除非在派生类中重新声明,否则基类的成员
也被视为派生类的成员。除构造函数之外的基类成员被认为是遗传由派生类。 [...]
尽管如此,在许多地方,直接和继承的非静态数据成员都被认为是专门调用继承的数据成员的,例如也在[class](决议后CWG 1672 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1672):
8.6 - 在其元素或非静态数据成员中包括上述类型之一的聚合或联合类型(递归地包括子聚合或包含的联合的元素或非静态数据成员),
Or in [基本.lval]:
7.8 - 如果 X 是非联合类类型,则如果 X 没有(可能是继承的(第 10 条)),则集合 M(X) 为空
非静态数据成员; [...]
同时,在许多地方,“成员”必须被理解为仅指直接成员才有意义;首先仅查看非静态数据成员(不是成员函数),[expr.rel]/3.2、[expr.const]/5.1、[dcl.constexpr]/4.6、[class.mem]/17、 /19,[特殊]/5,[class.ctor]/4.3,/4.4,/4.10,/4.12,[class.dtor]/5.6,[class.base.init]/2,/13.3,[类。 copy]/12.2、/12.4、/18.2、/25.2、/25.4、/26.3、/27、[ except.spec]/15.1.1.1、/15.2、/15.3 都是“非静态数据成员”可以使用的地方或者应该有“direct”前缀。
另一方面,在某些地方(例如在修改后的[class]中,或在[class.copy]/23.2-23.3,/28中)“成员”被隐式地视为包括继承的成员,所以有点混乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)