【问题标题】:what's the difference between (void *)variable and (void *&) variable in C++ when type casting类型转换时 C++ 中的 (void *)variable 和 (void *&) 变量有什么区别
【发布时间】:2012-11-02 17:14:30
【问题描述】:

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

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

【问题讨论】:

  • 您知道void *void *&amp; 之间的一般区别是什么,只是对选角感到困惑吗?
  • @Useless void * b; void * &amp;a = b a 是对类型为 (void *) 的 b 的引用(或别名),对吗?

标签: c++ void-pointers


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2017-12-05
      • 2012-08-09
      • 2017-05-02
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多