(5.2.10/6)C++ 03指向函数的指针可以显式转换为指向不同类型函数的指针。通过一个指向函数类型(8.3.5)调用函数 的效果是不一样的 在函数的定义中使用的类型是未定义的。除了 该类型的右值转换“指针T1”的类型“指针 到T2”(其中,T1和T2是功能类型),并且返回到其原始 类型产生的原始指针值,这样的指针的结果 转换未指定。 [注:也见4.10为 指针转换详情]将函数指针转换为指向函数类型的指针的结果
以下是我想要做的,而很显然,转换fp1
到fp2
的结果会产生一个原始的指针,但在同一时间标准的措辞是"The result of such a pointer conversion is unspecified"
这是什么意思?
int f() { return 42; }
int main()
{
void(*fp1)() = reinterpret_cast<void(*)()>(f);
int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
// Safe to call the function ?
fp2();
}
我想其他的转换就像'f'到'fp1'在我的情况下,对吗? – user1086635
@user:是的,没有指定'fp1'的内容,但是如果您转换回原始类型,则会返回原始值。 – sth
未定义的行为是,如果你试图做'(* fp1)();'。这会调用一个返回'int'的函数,就像它返回'void'一样。至少这取决于你的架构的ABI。如果它使用旧的C方法,在调用函数之前为堆栈中返回的对象分配空间,那么在这种情况下,它不会为返回的“int”分配空间(因为它认为没有返回值),并且被调用的函数会将其返回值放在错误的地方(例如覆盖返回地址),并且事情从此处下坡。 –