Здравствуйте, tyomitch, Вы писали:
T>Кстати, в gcc (и вроде бы стандартом тоже) запрещены касты из int в (int C::*&); ради такого преобразования предыдущим отписавшимся в треде и пришлось городить чёрти-что из шаблонов и юнионов.
И правильно! Я как и все остальные тут создавал UB кастя в int и size_t

Использовать можно только intptr_t или ptrdiff_t,
иначе:
int mem = offsetAinC + offsetof(A,x) ;
int C::* p = (int C::*&) mem
на 64 битных указателях, захватит несколько неожиданный кусочек памяти...