Dies ist sowohl in C ++ als auch in C definiert. Es verstößt nicht gegen strenge Aliasing-Bestimmungen, da der resultierende Zeiger nicht dereferenziert wird.
Hier ist das Zitat aus C ++ (dank @interjay und @VTT), das dies ermöglicht:
Ein Objektzeiger kann explizit in einen Objektzeiger eines anderen Typs konvertiert werden.
Hier ist das Zitat von C (danke @StoryTeller), das dies ermöglicht:
Ein Zeiger auf einen Objekttyp kann in einen Zeiger auf einen anderen Objekttyp konvertiert werden.
Diese geben an, dass ein Zeigertyp ohne Konsequenz in einen anderen Zeigertyp konvertiert (und dann optional zurückkonvertiert) werden kann.
Und hier ist das Zitat von POSIX , das diesen speziellen Fall zulässt:
Die Struktur sockaddr_in wird zum Speichern von Adressen für die Internetadressfamilie verwendet. Zeiger dieses Typs werden von Anwendungen zur Strukturierung von sockaddr * zur Verwendung mit Socket-Funktionen gegossen .
Da diese Funktion ( bind
) Teil der C-Standardbibliothek ist, weist alles, was im Inneren vor sich geht (insbesondere das Dereferenzieren des typgesteuerten Zeigers), kein undefiniertes Verhalten auf.
Um die allgemeinere Frage zu beantworten:
C und C ++ sind zwei verschiedene Sprachen. Wenn etwas in C definiert ist, aber nicht in C ++, ist es in C definiert, aber nicht in C ++. Keine implizite Kompatibilität zwischen den beiden Sprachen wird dies ändern. Wenn Sie Code verwenden möchten, der in C gut definiert, in C ++ jedoch nicht definiert ist, müssen Sie einen C-Compiler verwenden, um diesen Code zu kompilieren.