в Как напечатать адрес функции-члена в C ++ это использовать (недействительно *&), чтобы ввести переменную cast, я попытался использовать (void *), но с этим что-то не так. я спрашиваю, в чем разница между переменной (void *) и (void *)&) переменная в C ++ при приведении типов.
фрагмент кода в ссылке:
void TestClass::PrintMyFuncAddress(void)
{
void (TestClass::* ptrtofn)() = &TestClass::MyFunc;
cout << (void*&)ptrtofn<< endl;
}
void*
литой пытается преобразовать значение ptrtofun
, к значению типа указатель на пустоту. C ++ не обеспечивает такого преобразования из указателя на функцию-член в void*
Вот почему с этим что-то не так (возможно, оно не компилируется).
void*&
литой создает ссылку, чей реферранд является первым sizeof(void*)
байты памяти, начиная с первого байта, занятого объектом ptrtofn
, ptrtofun
не имеет типа void*
или совместимый тип, и даже не должны быть того же размера, что и void*
, Таким образом, использование ссылки имеет неопределенное поведение (это нарушение строгого псевдонима), но компилятору не нужно улавливать проблему.
Почти единственный способ переносить функцию указателя на член — это распечатать sizeof(ptrtofun)
байты, начиная с (unsigned char*)(&ptrtofun)
, Вы можете решить для себя, как именно вы хотите представлять эти байты (шестнадцатеричный является очевидным выбором), но помните, что результат не обязательно адрес в памяти кода для TestClass::MyFunc
, Функция указателя на член просто так не работает, потому что, например, им нужно разрешить указатель на виртуальную функцию, которая будет вызывать другой код в соответствии с динамическим типом объекта, к которому она обращена.
Бросить в пустоту *& даст вам ссылку на тип void *, что означает, что его можно использовать как l-значение. void * даст значение r, которое можно использовать в выражении. Но это на самом деле не имеет отношения к вашему вопросу.
Вы не можете преобразовать указатель на функцию-член в указатель на данные или указатель на функцию; это принципиально разные типы. Обычно sizeof (ptr_to_member_function)! = Sizeof (void *) (или sizeof (void (*) () в этом отношении).
Указатель на функцию-член не обязательно содержит указатель на начало кода для этой функции. Может содержать смещение в VTBL для виртуальных функций.
Хотя я не уверен, что уверен, что стандарт C ++ не допускает такие преобразования.