Легально и переносимо - не может. Все остальное хаки. Указатель на метод может вызываться через thrunk, быть составным и т.п. Размер указателя на член может быть больше чем sizeof(void*). Внутреннее устройство - это удел реализации (в VC вон, даже #pragma pointers_to_members есть). Это зависит от того что считать "использованием". boost::bind(&A::foo) ?
Да. Но в простых случаях будет работать (вызов через thunk с коррекцией this компилятор делает при множественном наследовании виртуального метода). Тем более, что интересует не вызов метода, а только адрес для сплайсинга. Кстати, GCC (g++) позволяет вполне легально и переносимо вызывать метод pObj->Method как свободную ф-цию pMethod(pObj). Имеется в виду, что метод имеет спец. конвенцию вызова, с _неявной_ передачей указателя на объект и потому не может вызываться в отрыве от объекта. bind просто прячет вызов foo как метода внутрь функтора.
Это и есть детали реализации. Один компилятор так, другой иначе. Речь была о другом. Да и под переносимостью обычно имеют понимают переносимоcть между компиляторами. Я имел ввиду что помимо непосредственно вызова функции, такие указатели можно копировать, сравнивать и т.д. другими словами - использование состоит не только в вызове.