对于标准布局类,it is legal将指向类对象的指针转换为指向类的第一个非静态数据成员的指针。现在假设第一个非静态数据成员恰好是私有(private)成员。这是修改类成员函数之外的私有(private)数据成员的合法方法吗?
如果没有,您能否指出标准的哪一部分阻止了它?
注意:这里的目的是更好地理解标准,而不是在实际代码中执行此操作。
最佳答案
"assume that the first non-static data member happens to be a private member"
如果所有非静态
数据成员都是私有(private)
,那就没问题了。来自 C++20 最终工作草案:
- 两个对象 a 和 b 是指针可相互转换的,如果:
- 它们是同一个对象,或者
- 一个是 union 对象,另一个是该对象的非静态数据成员 (
[class.union]
),或者 - 一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则为任何基类子对象该对象的 (
[class.mem]
),或 - 存在一个对象
c
,使得a
和c
是指针可相互转换的,并且c
和b
是指针可相互转换的。
11.2 类的属性 [class.prop]
- 类
S
是一个标准布局类,如果它:- — 没有非标准布局类类型(或此类类型的数组)或引用的非静态数据成员,
- —没有虚函数 (11.7.2) 和虚基类 (11.7.1),
- — 对所有非静态数据成员具有相同的访问控制 (11.9),
- ——没有非标准布局基类,
- ——最多有一个任意给定类型的基类子对象,
- — 类及其基类中的所有非静态数据成员和位字段首先在同一类中声明 类,并且
- ——没有类型集合 M(S) 的元素作为基类,其中对于任何类型 X,M(X) 定义为
101 [注:M(X) 是所有可能为零的非基类子对象的类型集合
X 中的偏移量。-尾注]
- ——如果 X 是一个非 union 类类型,没有(可能继承(11.7))非静态数据成员,则集合 M(X) 为空。
- - 如果 X 是非 union 类类型,且具有类型为 X0 的非静态数据成员(大小为零) 或者是 X 的第一个非静态数据成员(其中所述成员可以是匿名 union ), 集合M(X)由X0和M(X0)的元素组成。
- — 如果 X 是 union 类型,则集合 M(X) 是所有 M(Ui) 和包含所有 Ui 的集合的并集,其中每个 Ui 是 X 的第 i 个非静态数据成员的类型.
- — 如果 X 是元素类型为 Xe 的数组类型,则集合 M(X) 由 Xe 和 M(Xe) 的元素组成。
- — 如果 X 是非类、非数组类型,则集合 M(X) 为空
关于c++ - 访问标准布局类的私有(private)非静态第一个数据成员是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76038807/