Jest to zdefiniowane zarówno w C ++, jak i C. Nie narusza to ścisłych przepisów dotyczących aliasingu, ponieważ nie wyklucza wynikowego wskaźnika.
Oto cytat z C ++ (dzięki @interjay i @VTT), który pozwala na to:
Wskaźnik obiektu można jawnie przekonwertować na wskaźnik obiektu innego typu.
Oto cytat z C (dzięki @StoryTeller), który pozwala na to:
Wskaźnik do typu obiektu można przekonwertować na wskaźnik do innego typu obiektu.
Określają one, że jeden typ wskaźnika można przekonwertować na inny typ wskaźnika (a następnie opcjonalnie przekonwertować z powrotem) bez konsekwencji.
Oto cytat z POSIX, który pozwala na ten konkretny przypadek:
Struktura sockaddr_in służy do przechowywania adresów dla rodziny adresów internetowych. Wskaźniki tego typu będą rzutowane przez aplikacje na struct sockaddr * do użytku z funkcjami gniazd.
Ponieważ ta funkcja ( bind
) jest częścią standardowej biblioteki C, cokolwiek dzieje się w środku (a konkretnie dereferencja wskaźnika rzutowanego na typ) nie ma niezdefiniowanego zachowania.
Aby odpowiedzieć na bardziej ogólne pytanie:
C i C ++ to dwa różne języki. Jeśli coś jest zdefiniowane w C, ale nie w C ++, jest zdefiniowane w C, ale nie w C ++. Żadna domniemana zgodność między dwoma językami tego nie zmieni. Jeśli chcesz użyć kodu dobrze zdefiniowanego w C, ale niezdefiniowanego w C ++, będziesz musiał użyć kompilatora C do skompilowania tego kodu.