C++ erlaubt Referenzen auf Funktionen?!



  • 😮

    #include <iostream>
    
    void func()
    { std::cout << "Ja, tut es!\n"; }
    
    int main()
    {
        void (&funcref)() = func;
        funcref();
    }
    

  • Administrator

    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.


  • Mod

    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.


  • Mod

    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.


Anmelden zum Antworten