アスタリスクなしの関数ポインタパラメータ 質問する

アスタリスクなしの関数ポインタパラメータ 質問する

関数ポインタをパラメータとして受け取る関数の次のような定義を見たことがあります。

double fin_diff(double f(double), double x, double h  = 0.01) {
  return (f(x+h)-f(x)) / h;
}

私はこの定義をアスタリスク付きで見るのに慣れています。つまり、

double fin_diff(double (*f)(double), double x, double h  = 0.01);

最初の定義もなぜ有効であるかご存知ですか?

ベストアンサー1

標準では、関数の引数が関数の引数へのポインターになるように調整されているため、これら 2 つの関数は同等であるとされています。

16.1 オーバーロード可能な宣言 [over.load]
(3.3) 一方が関数型でもう一方が同じ関数型へのポインタである点のみが異なるパラメータ宣言は同等である。つまり、関数型は関数型へのポインタになるように調整される(11.3.5)。

Cでも同様:

6.7.5.3 関数宣言子(プロトタイプを含む)
8 パラメータを「関数戻り型」として宣言する場合は、6.3.2.1 に従って「関数戻り型へのポインタ」に調整する必要があります。

おすすめ記事