我有一个功能,比方说
void myfunc()
Run Code Online (Sandbox Code Playgroud)
如果我声明一个指针并将其分配给函数的地址,如下所示
void *test_pointer = (void*) &myfunc;
Run Code Online (Sandbox Code Playgroud)
并使用Visual Studio进入调试模式,我将从监视窗口获取以下内容
Name Value
&myfunc 0x000000013fc06570
test_pointer 0x000000013fa4786f
Run Code Online (Sandbox Code Playgroud)
现在我希望这两个值是相同的,为什么不是这样呢?
严格地说,C++标准不需要实现来支持将函数指针转换为不透明对象指针(void*).你可能被告知void*可以指出任何东西,但"任何东西"不一定是功能.
由于此功能仅受条件支持,因此无法确定如何进行此类转换.可能是您的实现只会void*在保留值的同时进行转换(这是标准所要求的最低要求).但是两个指针表示中的值不必相同.
引用最新的C++标准草案,[expr.reinterpret.cast]/8:
有条件地支持将函数指针转换为对象指针类型(反之亦然).这种转换的含义是实现定义的,除非实现支持两个方向的转换,将一种类型的prvalue转换为另一种类型并返回,可能具有不同的cv-qualification,将产生原始指针值.