在How to print member function address in C++中使用(void *&)来输入变量,我试图使用(void *),但是它有问题。我要问的是当类型转换时,C ++中的(void *)变量和(void *&)变量之间的区别是什么。 链接中的代码段:
void TestClass::PrintMyFuncAddress(void)
{
void (TestClass::* ptrtofn)() = &TestClass::MyFunc;
cout << (void*&)ptrtofn<< endl;
}
答案 0 :(得分:2)
void*
强制转换试图将ptrtofun
的值转换为指向void的类型的值。 C ++没有提供从指针到成员函数到void*
的转换,这就是它出错的原因(可能它没有编译)。
void*&
强制转换创建一个引用,其引用是从对象sizeof(void*)
占用的第一个字节开始的第一个ptrtofn
字节的内存。 ptrtofun
没有类型void*
或兼容类型,甚至不需要与void*
相同的大小。因此使用引用具有未定义的行为(它违反了严格的别名),但编译器无需捕获问题。
可移植打印指向成员函数的唯一方法是从sizeof(ptrtofun)
开始打印(unsigned char*)(&ptrtofun)
个字节。您可以自己决定如何表示这些字节(十六进制是显而易见的选择),但要注意结果而不是必然是TestClass::MyFunc
代码的内存中的地址。指针到成员函数根本不起作用,因为例如它们需要允许指向虚函数的指针,虚函数将根据调用它的对象的动态类型调用不同的代码。 p>
答案 1 :(得分:0)
施展无效*&amp;将为您提供void *类型的引用,这意味着它可以用作l值。 void *将给出可以在表达式中使用的r值。但这实际上与你的问题无关。
您无法将指向成员函数的指针转换为指向数据的指针或指向函数的指针;这些是根本不同的类型。通常是sizeof(ptr_to_member_function)!= sizeof(void *)(或sizeof(void(*)())。
指向成员函数的指针不一定包含指向该函数代码开头的指针。对于虚函数,它可能包含VTBL的偏移量。
虽然我不确定我是否相信C ++标准不允许这些转换。