Здравствуйте, rg45, Вы писали:
R>Ну потому что поле "a" является членом класса A. И выражение &D::a имеет тип указателя на член класса А. И указатель на член класса A без проблем может быть использован с объектом класса D, как с наследником класса A. А почему должно быть по-другому?
Согласен, в c++ если можно сделать
через ж... не единообразно то делают именно так.
R>И вообще, какую связь ты видишь между этими вопросами и данной темой?
Можно заранее (precompile) заготовить смещений

вот где... зато будет constexpr.
struct A { int a; };
struct B : virtual A { int b; };
struct C : virtual A { int c; };
struct D : B,C { int d; };
template<class C,auto>struct Info;
template<>struct Info<A,&A::a> { enum { ofs=101 }; };
template<>struct Info<B,&B::a> { enum { ofs=102 }; };
template<>struct Info<B,&B::b> { enum { ofs=103 }; };
template<>struct Info<C,&C::a> { enum { ofs=104 }; };
template<>struct Info<C,&C::c> { enum { ofs=105 }; };
template<>struct Info<D,&D::a> { enum { ofs=106 }; };
template<>struct Info<D,&D::b> { enum { ofs=107 }; };
template<>struct Info<D,&D::c> { enum { ofs=108 }; };
template<>struct Info<D,&D::d> { enum { ofs=109 }; };
int main(int argc, char **argv) {
enum { x=Info<D,&D::a>::ofs };
return 0;
}