Приведение void*
пытается преобразовать значение ptrtofun
в значение типа указатель на пустоту. С++ не обеспечивает такого преобразования из указателя на функцию-член в void*
, поэтому с ним что-то не так (вероятно, он не компилируется).
Приведение void*&
создает ссылку, реферандом которой являются первые sizeof(void*)
байтов памяти, начиная с первого байта, занятого объектом ptrtofn
. ptrtofun
не имеет типа void*
или совместимого типа и даже не обязательно должен быть того же размера, что и void*
. Таким образом, использование ссылки имеет неопределенное поведение (это нарушение строгого алиасинга), но компилятору не нужно обнаруживать проблему.
Практически единственный способ переносимой печати функции указателя на член — это вывести sizeof(ptrtofun)
байт, начиная с (unsigned char*)(&ptrtofun)
. Вы можете решить для себя, как именно вы хотите представлять эти байты (очевидный выбор - шестнадцатеричный), но имейте в виду, что результат не обязательно является адресом в памяти кода для TestClass::MyFunc
. Указатели на функцию-член просто так не работают, потому что, например, они должны разрешать указатель на виртуальную функцию, которая будет вызывать другой код в соответствии с динамическим типом вызываемого объекта.
person
Steve Jessop
schedule
02.11.2012
void *
иvoid *&
вообще, и вы просто запутались в приведении? - person Useless   schedule 02.11.2012void * b; void * &a = b
a
- это ссылка (или псевдоним) на b, тип которого (void *), я прав? - person toolchainX   schedule 02.11.2012