#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))
Run Code Online (Sandbox Code Playgroud)
我已经找了这个代码几分钟了,但我仍然不明白 const char 易失性引用是什么,这让我很头疼。
#define offsetof(s,m) ((size_t)&(((s*)0)->m))
Run Code Online (Sandbox Code Playgroud)
这个非常清楚,确实有意义并且运行良好,为什么 MSVC 编译器使用另一个。
如果s::m是类类型,它可能会重载operator&,因此&(((s*)0)->m)与 相同(((s*)0)->m).operator&(),这可能会做出意想不到的事情。
为了不使用任何 custom operator&,它被转换为const volatile char&第一个(它将具有相同的地址)。它必须同时是constandvolatile因为s::m可能是 const 和/或 volatile。
这是std::addressofC++11 之前的实现方式。