Kac*_*aye 2 c++ function-pointers
例如:
using namespace std;
#include <iostream>
void funcOne() {
}
void funcTwo( int x ) {
}
int main() {
void (*ptrOne)() = funcOne;
cout << ptrOne << endl; //prints 1
void (*ptrTwo)( int x ) = funcTwo;
cout << ptrTwo << endl; //prints 1
int (*ptrMain)() = main;
cout << ptrMain << endl; //prints 1
}
Run Code Online (Sandbox Code Playgroud)
有谁知道这背后的原因?起初我以为这是因为函数不存在于内存中,因为我从不调用它们,因此它们永远不会被添加到堆栈中.但即使是指向main函数的指针的值也会输出1.
函数指针不会隐式转换为void *,这就是operator <<重载.
这由C++11§4.10/ 2中的省略指定:
类型为"指向cv T的指针"的prvalue,其中T是对象类型,可以转换为类型为"指向cv void的指针"的prvalue.将"指向cv T的指针"转换为"指向cv void的指针"的结果指向T类型的对象所在的存储位置的开始,就好像该对象是类型T的最派生对象(1.8) (即,不是基类子对象).空指针值将转换为目标类型的空指针值.
函数类型不是对象类型.
而且,你甚至不能使用它static_cast.函数和对象可以存在于完全不同的地址空间(这称为哈佛架构),具有不同大小的指针.一个函数指针转换为void *可以也许可以用做reinterpret_cast:它的"有条件地支持的"(C++ 11§5.2.10/ 8).这样的a void *应仅用于打印或转换回原始函数指针类型.