使用省略号转换指向函数的指针

Bjö*_*lex 7 c++ function-pointers ellipsis

考虑以下程序:

#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));
}
Run Code Online (Sandbox Code Playgroud)

这在至少一个编译器上编译,运行和打印bar : 12 :)我在一些我应该维护的遗留代码中找到了这个,我想知道这是否安全/定义?

bar与类型不匹配fptr,因此使其工作的唯一方法是使用不安全的强制转换.我想这取决于省略号 - 魔法如何在内部工作,那么这是以某种方式定义的吗?

K-b*_*llo 9

代码正在做的是未定义的行为.如果它的工作只是偶然的,那么就不能保证它应该起作用.使用铸造函数指针唯一可以安全地完成的操作是将其转换回原始类型.