考虑以下计划:
#include <iostream>
typedef void (*fptr)(...);
void foo(fptr func) {
(*func)(12);
}
void bar(int x) {
std::cout << "bar : " << x << std::endl;
}
int main() {
foo(fptr(bar));
}
至少有一个编译器上的compiles, runs and prints bar : 12
:)我在一些我应该维护的遗留代码中发现了这个,我想知道这是否安全/定义?
bar
与fptr
类型不匹配,因此使其工作的唯一方法是使用不安全的强制转换。我想这取决于省略号 - 魔法如何在内部工作,那么是以某种方式定义的吗?
答案 0 :(得分:9)
代码正在做的是未定义的行为。如果它的工作只是偶然的,那么就不能保证它应该起作用。使用铸造函数指针唯一可以安全地完成的操作是将其转换回原始类型。