次のプログラムを検討してください。
#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));
}
これは、少なくとも 1 つのコンパイラでコンパイル、実行、および出力されます :) これは、維持するはずのレガシー コードで見つかりました。これは安全/定義されているのでしょうか?bar : 12
bar
は type と一致しないfptr
ため、これを機能させる唯一の方法は、安全でないキャストを使用することです。エリプシスマジックが内部でどのように機能するかに依存すると思いますが、それは何らかの方法で定義されていますか?