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

为什么有引用的类不遵守standard_layout?

浦修文
2023-03-14

执行以下代码:

#include <iostream>
#include <type_traits>

struct s_ref {
    int &foo;
};

struct s_ptr {
    int *foo;
};

int main(int argc, char *argv[])
{
    std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl;
    std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl;
    return 0;
}

结果:

s_ref is_standard_layout:0
s_ptr is_standard_layout:1

基于标准布局的使用(即:“标准布局类型对于与用其他编程语言编写的代码进行通信很有用”),这是有道理的,但我不确定违反了哪个规则:

标准布局类是一个类(用类、结构或联合定义),它:

>

  • 没有虚函数,也没有虚基类。

    对其所有非静态数据成员具有相同的权限改造(私有、受保护、公共)。

    要么在大多数派生类中没有非静态数据成员,最多有一个基类具有非静态数据元素,要么没有具有非静态元素的基类。

    它的基类(如果有的话)本身也是一个标准布局类。

    并且,没有与其第一个非静态数据成员相同类型的基类。

    编辑:引用自:http://www.cplusplus.com/reference/type_traits/is_standard_layout/,但http://en.cppreference.com/w/cpp/concept/StandardLayoutType也类似。

  • 共有3个答案

    鞠征
    2023-03-14

    在n4140中,您可以阅读:

    9 类 (7.1)

    标准布局类是这样的类:

    • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,

    [编辑]

    有关为什么带有引用的类不是标准布局的更多信息,请阅读以下精彩答案:C标准布局和引用

    温嘉玉
    2023-03-14

    我不知道你从哪里得到这句话,但它遗漏了标准中的相关规则。

    (N3337)[class]/7:标准布局类是一个类,它:

    -没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,

    -没有虚拟函数(10.3),也没有虚拟基类(10.1),

    —对所有非静态数据成员具有相同的访问控制(第11条),

    — 没有非标准布局基类,

    -在大多数派生类中没有非静态数据成员,并且最多有一个基类具有非静态数据元素,或者没有基类具有静态数据元素;以及

    — 没有与 f irst 非静态数据成员类型相同的基类。

    汝开畅
    2023-03-14

    C标准的标准布局类概念的要点是,这样一个类的实例可以可靠地作为字节访问或复制到字节,正如C 11标准在其§9/9中指出的那样,字节构成了这样一个类别

    ”用于与用其他编程语言编写的代码通信

    但是,C 标准根本不要求引用来使用存储。它不是一个对象。你不能拿走它的地址。因此,它不能(可靠地)复制到字节,或作为字节访问。因此,它与标准布局类的概念不兼容。

    在正式场合,

    "标准布局类是这样的类:< br> —没有非标准布局类类型的非静态数据成员(或这种类型的数组)或引用,

     类似资料:
    • 我使用spring Boot创建了压缩响应的配置。下面是我的配置。 问题是所有的响应都有header[Content-Encoding gzip],即使响应大小小于min响应大小,默认为2048字节。

    • 我正在尝试以一种方式管理日志记录,即最早的存档日志文件一旦达到总累积大小限制或达到最大历史记录限制,就会被删除。在Logback 1.1.7中使用时,滚动文件附加器将继续创建新的存档,尽管超过了设置。 这是日志中的一个bug还是我没有正确配置滚动文件附加器?

    • 及其等效的WinApi是流行且有用的宏。原则上,它们使用上的指针算法来恢复指向成员的给定指针所属聚合的指针。 极简主义的实现通常是: 然而,这个宏的使用模式的严格符合性是有争议的。例如: 据我了解,该程序不严格合规,因为: < li >表达式< code>s.b是< code>int类型的左值 < li > <代码> 我注意到问题不在于< code>container_of宏本身。而是构造< co

    • 我的Spring boot应用程序(V2.1.1.Release)使用以下插件和布局进行打包: 我正在使用下面的启动脚本: 在我的应用程序具有的一个依赖项中,下面的代码用于读取外部xml配置文件(例如hbase-site.xml): 这就是为什么我试图使用loader.path使这些文件可用,但应用程序仍然不能读取提供的dir中的文件。我还遗漏了什么吗? 前面已经提到:Spring Boot:是否

    • 问题内容: 结果如下: 2011-09-24 14:10:51 -0400 2011年9月24日星期六20:10:51 为什么当我解析来自format()的日期时,它不遵守时区? 问题答案: 您正在打印调用的结果,该调用 始终 使用默认时区。基本上,除了调试之外,您不应该使用其他任何东西。 不要忘记,一个不 具有 时区-它代表着一个时刻,因为自Unix纪元(午夜1970年1月1日UTC)毫秒。 如

    • 问题内容: 在管道级别,我指定代理和节点(带有标签和自定义工作区)。管道启动时,它将在指定的节点上运行,但是当命中“ build job”时,将选择第一个可用节点。我尝试使用NodeLabel插件,但是那也不起作用。 这是我的: 问题答案: 当您使用Jenkinsfile中的指令时,它告诉Jenkins您想要构建一个完全独立的作业。正是 其他工作 需要指定将要构建的代理。如果这是基于Jenkins