В чем разница между переменной (void *) и переменной (void * & amp;) в C ++ при приведении типов

в Как напечатать адрес функции-члена в C ++ это использовать (недействительно *&), чтобы ввести переменную cast, я попытался использовать (void *), но с этим что-то не так. я спрашиваю, в чем разница между переменной (void *) и (void *)&) переменная в C ++ при приведении типов.
фрагмент кода в ссылке:

void TestClass::PrintMyFuncAddress(void)
{
void (TestClass::* ptrtofn)() = &TestClass::MyFunc;
cout << (void*&)ptrtofn<< endl;
}

2

Решение

void* литой пытается преобразовать значение ptrtofun, к значению типа указатель на пустоту. C ++ не обеспечивает такого преобразования из указателя на функцию-член в void*Вот почему с этим что-то не так (возможно, оно не компилируется).

void*& литой создает ссылку, чей реферранд является первым sizeof(void*) байты памяти, начиная с первого байта, занятого объектом ptrtofn, ptrtofun не имеет типа void* или совместимый тип, и даже не должны быть того же размера, что и void*, Таким образом, использование ссылки имеет неопределенное поведение (это нарушение строгого псевдонима), но компилятору не нужно улавливать проблему.

Почти единственный способ переносить функцию указателя на член — это распечатать sizeof(ptrtofun) байты, начиная с (unsigned char*)(&ptrtofun), Вы можете решить для себя, как именно вы хотите представлять эти байты (шестнадцатеричный является очевидным выбором), но помните, что результат не обязательно адрес в памяти кода для TestClass::MyFunc, Функция указателя на член просто так не работает, потому что, например, им нужно разрешить указатель на виртуальную функцию, которая будет вызывать другой код в соответствии с динамическим типом объекта, к которому она обращена.

2

Другие решения

Бросить в пустоту *& даст вам ссылку на тип void *, что означает, что его можно использовать как l-значение. void * даст значение r, которое можно использовать в выражении. Но это на самом деле не имеет отношения к вашему вопросу.

Вы не можете преобразовать указатель на функцию-член в указатель на данные или указатель на функцию; это принципиально разные типы. Обычно sizeof (ptr_to_member_function)! = Sizeof (void *) (или sizeof (void (*) () в этом отношении).

Указатель на функцию-член не обязательно содержит указатель на начало кода для этой функции. Может содержать смещение в VTBL для виртуальных функций.

Хотя я не уверен, что уверен, что стандарт C ++ не допускает такие преобразования.

0

По вопросам рекламы [email protected]