Информация об изменениях

Сообщение Re[23]: offsetof() без UB от 27.03.2025 13:57

Изменено 27.03.2025 13:59 kov_serg

Re[23]: offsetof() без UB
Здравствуйте, rg45, Вы писали:

R>Ну потому что поле "a" является членом класса A. И выражение &D::a имеет тип указателя на член класса А. И указатель на член класса A без проблем может быть использован с объектом класса D, как с наследником класса A. А почему должно быть по-другому?


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;
}
Re[23]: offsetof() без UB
Здравствуйте, 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;
}