【问题标题】:Why must members of standard layout classes have the same access control? [duplicate]为什么标准布局类的成员必须具有相同的访问控制? [复制]
【发布时间】:2019-01-07 02:12:24
【问题描述】:

引用[class.prop]/3中的标准:

一个类 S 是一个标准布局类,如果它:

  • 对所有非静态数据成员具有相同的访问控制,

我的理解(也许我错了)一直认为 C++ 访问控制不会以任何方式影响类的物理布局——它们纯粹是一种增强封装的编译时机制。 (或者换一种说法,将成员从私有更改为公共不是 ABI 破坏性更改。)

如果是这种情况,那么标准布局类的这种限制的原因是什么?

【问题讨论】:

    标签: c++ language-lawyer standard-layout


    【解决方案1】:

    访问控制非常是否影响布局:一个访问控制级别内,非静态数据成员的地址按声明顺序增加,但没有要求不同访问级别的地址。

    由于标准布局是关于成员地址的,因此要求确保所有成员地址都处于明确定义的顺序。

    【讨论】:

    • IMO 这只是以不同的方式重述问题中已经存在的数据。这里真正的问题是:鉴于访问说明符完全是编译时的事情,只是为了生成错误消息,为什么它们会以任何方式影响二进制布局?在允许访问声明符影响二进制布局方面,该标准为实现者提供了什么样的帮助?
    • (更有趣的是,它只是为了允许更好地打包东西,但只有在它不会影响与 C 的兼容性时才允许它,或者它是否正式化了一些现有的 bizzarro 实现,例如保持所有私有开始时的成员?)
    • 嗯,你每天都会学到新东西!是否有任何实现实际上根据访问级别重新排序成员?
    • 这始终是真正的问题,不是吗?编译器“可能”做很多事情,但有时很难知道是否有人真正做这些事情,尤其是像这样的事情,除非你真的在寻找它,否则你很可能不会注意到。
    猜你喜欢
    • 2015-05-30
    • 2012-09-07
    • 2023-04-04
    • 2013-10-14
    • 2014-04-02
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多