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.
-
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.