関数名を関数ポインターとして使用することは、address-of演算子を関数名に適用することと同等であるというのは興味深いことです。
これが例です。
typedef bool (*FunType)(int);
bool f(int);
int main() {
FunType a = f;
FunType b = &a; // Sure, here's an error.
FunType c = &f; // This is not an error, though.
// It's equivalent to the statement without "&".
// So we have c equals a.
return 0;
}
名前の使用は、配列ですでにわかっていることです。しかし、あなたは次のようなものを書くことはできません
int a[2];
int * b = &a; // Error!
言語の他の部分と一致していないようです。このデザインの理論的根拠は何ですか?
この質問では、そのような動作のセマンティクスと、それが機能する理由について説明します。しかし、なぜ言語がこのように設計されたのか興味があります。
さらに興味深いのは、関数型は、パラメーターとして使用する場合は暗黙的にそれ自体へのポインターに変換できますが、戻り型として使用する場合はそれ自体へのポインターに変換されないことです。
例:
typedef bool FunctionType(int);
void g(FunctionType); // Implicitly converted to void g(FunctionType *).
FunctionType h(); // Error!
FunctionType * j(); // Return a function pointer to a function
// that has the type of bool(int).