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

时间:2017-09-22 13:16:06

标签: c++

目前,offsetof仅适用于标准布局类型。但是,我从来没有理解这个限制。当然,对于具有虚拟继承的类型,offsetof无效。但对于没有虚拟继承的类型,它可以。我知道,该标准允许非标准布局类型为每个实例具有不同的成员偏移量。但是,我从来没有听说过使用它的任何编译器实现。为什么会这样做呢?

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

所以问题是:

  • 是否有任何编译器,其成员的偏移量不是编译时常量(对于没有虚拟继承的类型)?
  • 为什么委员会没有放宽offsetof
  • 的要求

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

2 个答案:

答案 0 :(得分:6)

该限制的任意性质由委员会discussed in July。它还没有出现在工作文件中,但我相信它会在C ++ 20中放松(至少在这个程度上)。

答案 1 :(得分:2)

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

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