Im folgenden Code, Funktionszeiger und was ich als als „Funktionsverweis“ scheint identisch Semantik zu haben:Funktionszeiger vs Funktionsreferenz
#include <iostream>
using std::cout;
void func(int a) {
cout << "Hello" << a << '\n';
}
void func2(int a) {
cout << "Hi" << a << '\n';
}
int main() {
void (& f_ref)(int) = func;
void (* f_ptr)(int) = func;
// what i expected to be, and is, correct:
f_ref(1);
(*f_ptr)(2);
// what i expected to be, and is not, wrong:
(*f_ref)(4); // i even added more stars here like (****f_ref)(4)
f_ptr(3); // everything just works!
// all 4 statements above works just fine
// the only difference i found, as one would expect:
// f_ref = func2; // ERROR: read-only reference
f_ptr = func2; // works fine!
f_ptr(5);
return 0;
}
ich gcc Version 4.7.2 in Fedora/Linux verwendet
UPDATE
Meine Fragen sind:
Warum benötigt der Funktionszeiger keine Dereferenzierung?Warum führt die Dereferenzierung einer Funktionsreferenz nicht zu einem Fehler?- Ist (gibt es) Situationen, in denen ich eine über die andere verwenden muss?
- Warum funktioniert
f_ptr = &func;
? Da Func in einen Zeiger zerfallen sollte?
Währendf_ptr = &&func;
funktioniert nicht (implizite Konvertierung vonvoid *
)
ist das ein Implementierungsfehler? "coz, das geht gegen unsere intuitiven Konzepte von" tippen ", nicht wahr? Ich habe auch etwas wie 'void (* & f) (void)' als Funktionsparameter gesehen - '*' und '&' zusammen benutzt .. wie kommt es? – John
Es ist kein Fehler, nur die Art wie die Sprache definiert ist. In Ausdrücken gibt es grundsätzlich keine Funktionen, es gibt nur Funktionszeiger; Decay sorgt dafür, dass die "offensichtliche" Syntax funktioniert (d. h. Sie können 'f (1)' anstelle von "tumber" (& f) (1) ') eingeben. –
@John: Vergleichen Sie mit der Art, wie Arrays gehandhabt werden; sie können nicht durch den Wert übergeben werden, so dass in einem Funktionsprototyp "int x []" (und zu diesem Zweck ("int x [10]") äquivalent zu "int * x" ist, da ein C-Array empfangen wird value ist nicht legal, sie lassen die Array-Deklarationssyntax als syntaktischen Zucker zum Empfangen eines Zeigers verwenden. – ShadowRanger