Warum wird der Funktionsname als Funktionszeiger verwendet, um den Operator address-of auf den Funktionsnamen anzuwenden?
Das ist interessantDas Verwenden des Funktionsnamens als Funktionszeiger entspricht dem Anwenden der Operatoradresse auf den Funktionsnamen!
Hier ist das Beispiel.
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;
}
Den Namen zu verwenden, ist etwas, das wir bereits im Array kennen. Aber so etwas kann man nicht schreiben
int a[2];
int * b = &a; // Error!
Es scheint nicht mit anderen Teilen der Sprache vereinbar zu sein. Was ist das Grundprinzip dieses Entwurfs?
Diese Frage erklärt die Semantik eines solchen Verhaltens und warum es funktioniert. Aber ich bin daran interessiert, warum die Sprache so gestaltet wurde.
Interessanter ist, dass der Funktionstyp bei Verwendung als Parameter implizit in einen Zeiger auf sich selbst konvertiert werden kann, bei Verwendung als Rückgabetyp jedoch nicht in einen Zeiger auf sich selbst konvertiert wird!
Beispiel:
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).