当前位置: 首页 > 知识库问答 >
问题:

为什么这个派生类不是标准布局类?

阴凯歌
2023-03-14

为什么C 17下< code>bar不是标准的布局类型?

#include <type_traits>

class foo {
    int x;
};

static_assert(std::is_standard_layout<foo>::value);

class bar : public foo {
    float y;
};

static_assert(std::is_standard_layout<bar>::value); // "static assertion failed"

基于CPP reference的描述和一个非常相似的问题,我理解为什么在C 14之前这不是一个标准的布局类型,但是我无法连接CPP Reference的描述项,通过排除所有其他内容,应该是适用于这里的一个:“没有一个基类子对象具有与非联合类型相同的类型,作为第一个非静态数据成员(参见空基优化),并且,递归地, 该数据成员的第一个非静态数据成员(如果它具有非联合类类型),或者该数据成员的所有非静态数据成员(如果它具有联合类型),或者该数据成员的元素(如果它具有数组类型),等等

共有1个答案

左丘昊天
2023-03-14

< code>bar不满足您引用的要求之前的要求(来自标准布局类别的cppreference.com页面):

要求:

>

  • [...]

    将所有非静态数据成员和位字段声明在同一个类中(要么全部在派生中,要么全部在某个基中)

    [...]

    bar 具有一个直接的非静态数据成员浮点 y;和一个从 foo 继承的非静态数据成员 int x;

    这一特殊要求的措辞自C14以来(在很大程度上?)在功能上等同于之前的措辞,这也在你链接的问题的答案中提到。

    之所以更改它只是因为在措辞上可能存在误解,请参阅CWG问题1813,并且添加了位字段,因为它们可能未包含在术语“成员”中,请参阅CWG问题1881。

  •  类似资料:
    • 问题内容: 我已经阅读了一些文章,但没有得到实际的信息。有人可以向我解释。 仅与IE6相关吗? 这是什么? 是IE唯一的TAG吗? 编辑: 我发现此信息对我很有帮助 由于Internet Explorer很老(因为它是最早可用的浏览器之一),所以它没有像现在的浏览器那样重新启动。因此,随着时间的流逝,Microsoft开始改编新引擎以使用CSS。看起来不错……但是,CSS改变了Internet E

    • C 14的[class]/7中定义了一个标准布局类,如下所示(重点是我的): 标准布局类是这样的类: (7.1)-没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员, (7.2)-没有虚拟函数(10.3)和虚拟基类(10.1), (7.3)-对所有非静态数据成员具有相同的访问控制(第11条), (7.4)-没有非标准布局基类, (7.5)-在大多数派生类中没有非静态数据成员,并且最多有

    • 实体或字段可以映射到/字段,例如,可以映射到: 然而,生成的实现类不包括类的任何导入语句,尽管它存在于抽象类中,因此代码不编译: 为什么会这样?我做错了吗?怎么解决这个? Edit2:在MapStruct的Github上发布了这个问题:https://Github.com/mapstruct/mapstruct/issues/844

    • 如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?

    • 为什么一个虚函数在派生类中默认是虚的,甚至不可能在派生类中完全移除虚性,这有什么好的理由吗? 我希望这种行为的原因与我不希望默认情况下每个函数都是的原因相同。编译器可能会生成牺牲性能的vtables。 基类应该有一个vtable(我想要多态性在那里),但派生类没有vtable(我不希望多态性在那里,为什么我要那样,只是因为它派生了一个具有多态性的类?)。 我想解决的问题是更好地理解虚函数。我只是没

    • 当我跑的时候 我在Java中得到错误。为什么?这相当于false==false,这是真的。这不是Java特有的,我在其他语言中也得到了相同的结果。这是因为短路评估吗?似乎左右双方仍会/应该进行比较。