【问题标题】:Definition of standard-layout class in C++14C++14中标准布局类的定义
【发布时间】:2017-02-15 16:15:23
【问题描述】:

standard-layout 类在 C++14 的 [class]/7 中定义,如下(重点是我的):

标准布局类是这样的类:

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

我的担忧与项目符号 (7.5) 相关:如何在最派生的类中拥有 no 非静态数据成员,同时拥有一个具有非静态数据成员的基类?静态数据成员?

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

【问题讨论】:

  • 把物体想象成俄罗斯的马特鲁斯卡娃娃。最衍生的对象是娃娃的外壳。而最基本的对象是其核心。
  • 最终,它们是不同的娃娃。
  • 你是说俄罗斯套娃吗?
  • @bipll 是的,那些:P

标签: c++ c++14 language-lawyer


【解决方案1】:

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

标准布局类是这样的类:[...]

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

要做到这一点有点棘手;尽管 [class.derived] 有:

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

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

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

或者在[basic.lval]中:

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

同时,在许多地方,“成员”必须被理解为仅指直接成员才有意义;首先只看非静态数据成员(不是成员函数),[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,[class.复制]/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 中)“members”被隐含地包含继承的成员,所以有点一团糟。

【讨论】:

  • No, non-static data members of a base class are not considered to be non-static data members of the derived class. 标准中有对此的具体引用吗?
  • 7.8 - If X is a non-union class type, the set M(X) is empty if X has no (possibly inherited (Clause 10)) non-static data members; 我在 C++14 中找不到这个。
  • @Alexander 那是CWG 1672
  • 我期待您在 c++ 标准讨论中的帖子。谢谢。
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多