Size: a a a

2021 March 26

O

Oleksandr in pro.cxx
Имеет ли смысл проверять указатель на член на нулл, т.е. имеет ли смысл такой код?
    struct Foo { int x; };
   Foo foo;
   auto xPtr = &Foo::x;
   if (xPtr) {
       std::cout << "here" << std::endl;
   }
источник

d

disba1ancer in pro.cxx
Oleksandr
Имеет ли смысл проверять указатель на член на нулл, т.е. имеет ли смысл такой код?
    struct Foo { int x; };
   Foo foo;
   auto xPtr = &Foo::x;
   if (xPtr) {
       std::cout << "here" << std::endl;
   }
Тут это не имеет никакого смысла, со включённой оптимизацией компилятор проверку вообще выкинет
источник

O

Oleksandr in pro.cxx
disba1ancer
Тут это не имеет никакого смысла, со включённой оптимизацией компилятор проверку вообще выкинет
Хотел было спросить "а если вместо xPtr будет нул", но решил проверить на годболте и сам все понял
источник

O

Oleksandr in pro.cxx
источник

O

Oleksandr in pro.cxx
Похоже в случае указателей на члены для nullptr используется -1, а не 0
источник

BU

Boris Usievich in pro.cxx
Видимо потому, что "указатель на член" это вовсе не указатель а целочисленное смещение
источник

O

Oleksandr in pro.cxx
Boris Usievich
Видимо потому, что "указатель на член" это вовсе не указатель а целочисленное смещение
Я как раз поэтому и задался вопросом "как отличить указатель на первый член от "нулевого" указателя"
источник

AE

Alexander E. in pro.cxx
Boris Usievich
Видимо потому, что "указатель на член" это вовсе не указатель а целочисленное смещение
а вы поняли, почему -1? наверное, с таким же успехом можно было 1 битик инвертировать в ст.разряде, а не все :)
источник

BU

Boris Usievich in pro.cxx
-1 потому что это не может быть валидным смещением поля
источник

DF

Dollar Føølish in pro.cxx
Boris Usievich
Видимо потому, что "указатель на член" это вовсе не указатель а целочисленное смещение
+++
источник

DF

Dollar Føølish in pro.cxx
member pointers are not pointers
источник

DF

Dollar Føølish in pro.cxx
всем заинтересованным могу посоветовать книжку C++ object model липмана ,либо Itanium ABI
источник

AE

Alexander E. in pro.cxx
Boris Usievich
-1 потому что это не может быть валидным смещением поля
а 0x80000000, стало быть, может? :)
источник

АК

Александр Караев... in pro.cxx
Alexander E.
а вы поняли, почему -1? наверное, с таким же успехом можно было 1 битик инвертировать в ст.разряде, а не все :)
старший битик пришлось бы постоянно убирать
источник

BU

Boris Usievich in pro.cxx
Alexander E.
а 0x80000000, стало быть, может? :)
А почему бы и нет :)
источник

d

disba1ancer in pro.cxx
Oleksandr
Похоже в случае указателей на члены для nullptr используется -1, а не 0
Только зачем оно тебе не понятно...
источник

O

Oleksandr in pro.cxx
disba1ancer
Только зачем оно тебе не понятно...
Что именно? Детали реализации или указатель на член?
источник

d

disba1ancer in pro.cxx
Oleksandr
Что именно? Детали реализации или указатель на член?
И то и другое
источник

O

Oleksandr in pro.cxx
disba1ancer
И то и другое
Первое - из любопытства.
Второе - я сейчас пишу что-то вроде интерпретатора для своего ЯП, который будет работать с типами и объектами на C++, для этого такие типы мне нужно зарегистрировать в самописной RTTI. У каждого типа может быть набор "проперти", каждая "проперти" - это либо пара методов геттер/сеттер, либо поле.
источник

O

Oleksandr in pro.cxx
Указатели на члены нужны для таких вот проперти из полей. Чтобы можно было писать не только
registerProperty("x", &Foo::getX, &Foo::setX)
, но и просто
registerProperty("x", &Foo::x)
источник