Re[22]: offsetof() без UB
От: rg45 СССР  
Дата: 27.03.25 13:50
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, rg45, Вы писали:


R>>Здравствуйте, kov_serg, Вы писали:


_>>>
_>>>#include <iostream>

_>>>struct A { int a; };
_>>>struct B : virtual A { int b; };
_>>>struct C : virtual A { int c; };
_>>>struct D : B,C { int d; };

_>>>template<class T> T* get_instance() { static T t[1]; return t; }
_>>>template<class T,auto m> size_t offset() {
_>>>    T *t=get_instance<T>(); return (char*)&(t->*m)-(char*)t;
_>>>}

_>>>int main(int argc,char **argv) {
_>>>    std::cout<< "b:" << offset<D,&D::b>() << std::endl;
_>>>    std::cout<< "c:" << offset<D,&D::c>() << std::endl;
_>>>    std::cout<< "d:" << offset<D,&D::d>() << std::endl;
_>>>    std::cout<< "a:" << offset<D,&D::a>() << std::endl;
_>>>    return 0;
_>>>}
_>>>


R>>И что ты хочешь продемонстрировать этим примером?

_>То что в C++ нет указателя &D::a вместо используется &A::a. Вот нахрена так было делать?

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

И вообще, какую связь ты видишь между этими вопросами и данной темой?
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.