Я думаю, что &(foo.bar)
это просто обычный указатель на переменную.Говоря «указатель на член», мы имеем в виду что-то вроде &(FooClass::bar)
, без указания каких-либо объектов!Обратите внимание, что это значение может фактически вычисляться во время компиляции и может использоваться, например, в шаблонах.
Указатели-члены имеют очень странный синтаксис.
Попробуйте запустить следующий код:
#include <stdio.h>
class FooClass {
public:
int bar;
int bar2;
FooClass() : bar(0), bar2(0) {}
};
int main() {
//Showing what member pointers actually hold:
int FooClass::* barPtr=&FooClass::bar;
int FooClass::* bar2Ptr=&FooClass::bar2;
printf("barPtr=%p\nbar2Ptr=%p\n",barPtr,bar2Ptr);
//Showing how to use them:
FooClass foo;
foo.*bar2Ptr=42;
printf("foo={%d,%d}\n",foo.bar,foo.bar2);
}
Вы получите вывод:
barPtr=0x0
bar2Ptr=0x4
foo={0,42}
Как видите, оба значения содержат смещение члена от начала класса.Они могут быть вычислены, даже если вы не знаете, над каким объектом вы работаете.
Но если вы хотите разыменовать их, вы должны предоставить объект - это то, что делает оператор .*
.