2

How to print member function address in C++ it use (void *&) to type cast the variable 中,我尝试使用 (void *),但它有问题。我要问的是类型转换时 C++ 中的 (void *)variable 和 (void *&) 变量有什么区别。链接中的代码片段:

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

2 回答 2

2

void*强制转换尝试将 , 的值转换为指向ptrtofun空指针类型的值。C++ 没有提供从指针到成员函数到 的这种转换void*,这就是它有问题的原因(可能它无法编译)。

void*&强制转换创建一个引用,它的引用是从sizeof(void*)object 占用的第一个字节开始的内存的第一个字节ptrtofnptrtofun没有类型void*或兼容类型,甚至不需要与void*. 所以使用引用有未定义的行为(它违反了严格的别名),但编译器不需要发现问题。

可移植地打印指向成员函数的唯一方法是打印sizeof(ptrtofun)(unsigned char*)(&ptrtofun). 您可以自己决定如何表示这些字节(十六进制是显而易见的选择),但请注意,结果不一定TestClass::MyFunc. 指向成员函数的指针根本不会那样工作,因为例如它们需要允许指向虚函数的指针,该指针将根据调用它的对象的动态类型调用不同的代码。

于 2012-11-02T17:40:01.607 回答
0

强制转换为 void *& 将为您提供对 void * 类型的引用,这意味着它可以用作左值。void * 将给出可用于表达式的 r 值。但这实际上与您的问题无关。

您不能将指向成员函数的指针转换为指向数据的指针或指向函数的指针;这些是根本不同的类型。通常 sizeof(ptr_to_member_function) != sizeof(void*) (或 sizeof(void (*)() 就此事而言)。

指向成员函数的指针不一定包含指向该函数代码开头的指针。它可能包含虚拟功能的 VTBL 偏移量。

虽然我不确定我是否非常有信心 C++ 标准不允许这些转换。

于 2012-11-02T17:43:02.310 回答