对于类型 T 及其成员变量 m,offsetof(T, m) 的最简单形式是
&static_cast<T*>(0)->m
虽然很明显是UB。假设 T 是 POD 或非 POD 但没有虚拟继承,有没有办法在不涉及 UB 的情况下做同样的事情?或者,有没有办法确保在编译时在当前实现(正在编译代码)下保证表达式被评估为正确的值?
目前,我在当前版本的 GCC、Clang 和 Visual C++ 中使用上述表达式没有任何问题,但它受到了最近在我们的代码库中强制执行的 GCC 的未定义行为清理程序的威胁。