C++ erlaubt Referenzen auf Funktionen?!
-

#include <iostream> void func() { std::cout << "Ja, tut es!\n"; } int main() { void (&funcref)() = func; funcref(); }
-
Also es erlaubt ganz sicher folgendes:
void Func(int x, char* p) { // Was aus immer } int main() { int x; char* p; void (*pFunc)(int,char*) = Func; pFunc(x, p); }Nennt sich Funktionszeiger. Daher denke ich werden wohl Referenzen auch erlaubt sein, wieso nicht?
Grüssli
-
Danke, fuer deine Antwort, aber danach hab ich nicht gefragt. Ich weiss, was function pointer sind, aber ich habe noch nie eine function reference gesehen.
-
referenzen auf funktionen sind zulässig, wenn auch nicht besonders sinnvoll. tatsächlich sind funktionen in C++ lvalues eines funktionstyps - andernfalls könnte man sie nicht zur initialisierung von besagten referenzen benutzen, diese lvalues verweisen aber nicht auf ein objekt, und degenerieren in fast allen kontexten in pointer auf funktionen:
#include <iostream> #include <ostream> void func() { std::cout << "Ja, tut es!\n"; } template<typename T> struct Foo { static const int value = 0; }; template<typename T> struct Foo<T*> { static const int value = 1; }; template<typename T> struct Foo<T&> { static const int value = 2; }; template<typename T> void foo(T) { std::cout << Foo<T>::value << std::endl; } int main() { void (&funcref)() = func; funcref(); foo(func); foo(funcref); }für nichtstatische memberfunktionen gilt dies nicht: es gibt keine referenzen auf nichtstatische memberfunktionen und es existieren auch keine geeigneten operatoren dafür.
-
@camper: Danke fuer die Antwort!

Darf man fragen, woher du sowas weisst? Wo kann man sich genauer zum Thema 'interne Implementation von Funktionen/Methoden in C++' informieren?
-
camper schrieb:
...
... struct Foo { static const int value = 0; }; ......
Lustigerweise kommt mein einer Compiler (VC++ 6.0) damit nicht klar, sondern moniert an:
"... error C2252: 'value' : Nur Funktionen koennen rein virtuell deklariert werden"
(selbst ohne template)Er kennt also keine statischen Memberkonstanten.
Der GCC macht's aber.Gruß,
Simon2.
-
Simon2 schrieb:
camper schrieb:
...
... struct Foo { static const int value = 0; }; ......
Lustigerweise kommt mein einer Compiler (VC++ 6.0) damit nicht klar, sondern moniert an:
"... error C2252: 'value' : Nur Funktionen koennen rein virtuell deklariert werden"
(selbst ohne template)Er kennt also keine statischen Memberkonstanten.
Der GCC macht's aber.Gruß,
Simon2.
ja, das ist der vc++6.0 kein vorzeige-compiler. nimm halt alternativ enums. es ging mir ja nur darum, zu demonstrieren, welcher parametertyp hier als folge des funktionsarguments deduziert wird.
-
camper schrieb:
...ja, das ist der vc++6.0 kein vorzeige-compiler. nimm halt alternativ enums. es ging mir ja nur darum, zu demonstrieren, welcher parametertyp hier als folge des funktionsarguments deduziert wird.
Habe das schon richtig verstanden und nehme den VC++6.0 auch nur, weil er auf der Arbeit vorgeschrieben ist (und da werden mir für templates und Funktionsreferenzen sowieso die Hände abgehackt
).
Interessante Sachen mache ich eh' mit dem gcc.
Gruß,
Simon2.