gpt4 book ai didi

c++ - 在 C++14 中 [class]/7 中的要点 (7.5) 的目的是什么?

转载 作者:太空狗 更新时间:2023-10-29 23:13:21 25 4
gpt4 key购买 nike

这基本上是 my prior question 的延续.

这是 C++14 中的 [class]/7:

标准布局类是这样的类:

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

考虑以下片段:

struct B{ int i; };
struct A : B{ int j; };

A 满足要点 (7.1) 至 (7.4),但不满足 (7.5),因为 A 具有非静态数据成员并且具有具有非静态数据成员的基类。

A 作为标准布局类有什么问题?

编辑

据我所知 accepted answer关于这被认为是一个骗子的问题,如果我试图将指向 A 的指针转换为基类 B< 的第一个数据成员,上面的代码片段将具有未定义的行为 并返回,因为 OP 写了这句话:

在一个类中,成员按照声明顺序递增地址分配。但是,C++ 不规定跨类分配数据成员的顺序。

但这似乎并没有回答我的问题。例如,假设在某个编译器实现中,基 B 将在内存中跟在 struct A 之后,而不是在它之前。但是,根据 [conv.ptr]/3,这与存在从指向派生类的指针到指向基类的指针的隐式转换这一事实相矛盾:

A prvalue of type “pointer to cv D”, where D is a class type, can be converted to a prvalue of type “pointer to cv B”, where B is a base class (Clause 10) of D.

也就是说,如果基类B在内存中跟在struct A之后,上面的隐式转换是无效的。

最佳答案

直接回答问题:

此项目符号的目的是允许非常简单的继承情况,其中只有一个类具有数据成员。

继承的数据布局未指定,因此标准可能完全不允许继承,但如果一个类没有数据,则标准会异常(exception),以将结果仍视为标准布局。

关于c++ - 在 C++14 中 [class]/7 中的要点 (7.5) 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39924012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com