c++ - 访问标准布局类的私有(private)非静态第一个数据成员是否合法?

标签 c++ access-modifiers standard-layout

对于标准布局类,it is legal将指向类对象的指针转换为指向类的第一个非静态数据成员的指针。现在假设第一个非静态数据成员恰好是私有(private)成员。这是修改类成员函数之外的私有(private)数据成员的合法方法吗?

如果没有,您能否指出标准的哪一部分阻止了它?

注意:这里的目的是更好地理解标准,而不是在实际代码中执行此操作。

最佳答案

"assume that the first non-static data member happens to be a private member"

如果所有静态数据成员都是私有(private),那就没问题了。来自 C++20 最终工作草案:

[basic.compound]

  • 两个对象 a 和 b 是指针可相互转换的,如果:
    1. 它们是同一个对象,或者
    2. 一个是 union 对象,另一个是该对象的非静态数据成员 ( [class.union] ),或者
    3. 一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则为任何基类子对象该对象的 ( [class.mem] ),或
    4. 存在一个对象c,使得ac是指针可相互转换的,并且cb 是指针可相互转换的。

  • 11.2 类的属性 [class.prop]

  • S 是一个标准布局类,如果它:
    1. — 没有非标准布局类类型(或此类类型的数组)或引用的非静态数据成员,
    2. —没有虚函数 (11.7.2) 和虚基类 (11.7.1),
    3. 对所有非静态数据成员具有相同的访问控制 (11.9),
    4. ——没有非标准布局基类,
    5. ——最多有一个任意给定类型的基类子对象,
    6. — 类及其基类中的所有非静态数据成员和位字段首先在同一类中声明 类,并且
    7. ——没有类型集合 M(S) 的元素作为基类,其中对于任何类型 X,M(X) 定义为 101 [注:M(X) 是所有可能为零的非基类子对象的类型集合 X 中的偏移量。-尾注]
      1. ——如果 X 是一个非 union 类类型,没有(可能继承(11.7))非静态数据成员,则集合 M(X) 为空。
      2. - 如果 X 是非 union 类类型,且具有类型为 X0 的非静态数据成员(大小为零) 或者是 X 的第一个非静态数据成员(其中所述成员可以是匿名 union ), 集合M(X)由X0和M(X0)的元素组成。
      3. — 如果 X 是 union 类型,则集合 M(X) 是所有 M(Ui) 和包含所有 Ui 的集合的并集,其中每个 Ui 是 X 的第 i 个非静态数据成员的类型.
      4. — 如果 X 是元素类型为 Xe 的数组类型,则集合 M(X) 由 Xe 和 M(Xe) 的元素组成。
      5. — 如果 X 是非类、非数组类型,则集合 M(X) 为空
  • 关于c++ - 访问标准布局类的私有(private)非静态第一个数据成员是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76038807/

    相关文章:

    c++ - 什么是聚合和POD,它们为何/为什么特别?

    c++ - C++11 中类型的逐字节拷贝?

    c++ - pthread_cond_wait/signal 和 mutex 未按预期工作

    c++ - 在C++中调用重写的方法后得到错误的输出

    c# - 静态、内部和公共(public)构造函数之间有什么区别?

    java - java.lang.Object 的 protected 方法如何免受子类的影响?

    c++ - 为什么具有多个公共(public)访问说明符的类是 standard_layout?

    python - Spyder IDE 不释放 DLL 资源?

    c++ - iomanip/固定宽度持久性

    java - 访问修饰符