首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在[class]/7中,在C++14中,子弹点(7.5)的目的是什么?

在[class]/7中,在C++14中,子弹点(7.5)的目的是什么?
EN

Stack Overflow用户
提问于 2016-10-07 18:49:01
回答 1查看 148关注 0票数 3

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

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

标准布局类是这样一个类:

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

考虑以下片段:

代码语言:javascript
运行
复制
struct B{ int i; };
struct A : B{ int j; };

A通过(7.4)满足项目点(7.1),但不满足(7.5),因为A有一个非静态数据成员,并且有一个带有非静态数据成员的基类。

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

编辑

就我所能理解的accepted answer而言,如果我试图将指向基类B和back的第一个数据成员的指针转换为B和back基类的第一个数据成员,那么上面的片段就会有未定义的行为,因为这句话由OP编写:

Within a class, members are allocated in increasing addresses according to the declaration order. However C++ doesn't dictate the order of allocation for data members across classes.

但这似乎没有回答我的问题。例如,假设在某个编译器实现中,基本B将在内存中跟随struct A,而不是在其前面。但是,这与这样一个事实相矛盾,即从指针到派生类,到指向基类的指针,都有一个隐式转换,根据class . But /3:

类型“指针到cv”的prvalue (其中D是类类型)可以转换为类型“指针到cv”的prvalue,其中B是D的基类(第10条)。

也就是说,如果基本B在内存中遵循struct A,则上述隐式转换将无效。

EN

回答 1

Stack Overflow用户

发布于 2016-10-08 11:09:44

直接回答问题的措辞如下:

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

继承的数据布局未指定,因此标准可能完全不允许继承,但如果一个类没有数据来将结果作为标准布局来处理,则标准会出现异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39924012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档