Funktionpointer Casten



  • Hallo,

    darf man eigentlich Funktionszeiger nach void* casten, und dann wieder zurück?
    Und ist das folgende erlaubt?

    float f(float v) { return v; }
    
    float (*ptr1)(float);
    ptr1 = &f;
    boost::any (*ptr2)(float);
    ptr2 = reinterpret_cast<boost::any(*)(float)> ptr1;
    


  • 2x nein.

    Funktionszeiger sind von normalen Zeigern verschieden (void* ist ein normaler Zeiger), daher geht der Cast nach void* nicht.

    Und dein reinterpretcast zeigt schon an, dass beim zweiten etwas nicht stimmt.


  • Mod

    pyhax schrieb:

    Hallo,

    darf man eigentlich Funktionszeiger nach void* casten, und dann wieder zurück?

    conditionally-supported. Eine Implementation darf das erlauben, muss aber nicht (5.2.10/8). Wenn es unterstützt wird, muss die Rückkonvertierung den ursprünglichen Wert ergeben.

    pyhax schrieb:

    Und ist das folgende erlaubt?

    ...
    

    Von Syntaxfehlern abgesehen, ja. Funktionszeiger können ineinander (per reinterpret_cast) konvertiert werden. Eine Rückkonvertierung in den ursprünglichen Typ ergibt auch den ursprünglichen Wert. Man kann also irgendeinen Funktionszeiger Typ zum Speichern beliebiger Funktionszeiger verwenden (analog zu void* für Objektzeiger).
    Ein Aufruf mit dem falschen Typ führt zu UB.


Anmelden zum Antworten