为什么我们没有适用于所有类型的偏移量(具有虚拟继承的类型除外)?

Why don't we have offsetof which works with all types (except types with virtual inheritance)?

本文关键字:类型 继承 虚拟 偏移量 我们 适用于 为什么      更新时间:2023-10-16

当前,offsetof仅与标准布局类型一起使用。但是,我从来没有理解这个限制。当然,对于具有虚拟继承的类型,offsetof无法正常工作。但是对于没有虚拟继承的类型,它可以。我知道,该标准允许非标准布局类型对于每个实例都具有不同的成员偏移。但是,我从未听说过使用此功能的任何编译器实现。为什么会这样做?

我知道的所有编译器,对于没有虚拟继承的类型,会员的偏移是编译时常数。

所以问题是:

  • 是否有编译器,对于哪些成员的偏移不是编译时间常数(对于没有虚拟继承的类型)?
  • 为什么委员会不放松offsetof的要求?

(我在stackoverflow上阅读了很多相关的答案,并在各个地方对此进行了讨论,但是我还没有找到原因)。

委员会在7月讨论了该限制的任意性质。它还没有在工作文件中,但我相信它将在C 20中放松(至少在这个程度上)。

放松要求到什么offsetof可以使用,除非给出不正确的结果?

访问C 对象的选定数据成员的方法是指向数据成员的指针