Это определено как в C ++, так и в C. Это не нарушает строгих правил псевдонимов, поскольку не разыменовывает результирующий указатель.
Вот цитата из C ++ (благодаря @interjay и @VTT), которая позволяет это:
Указатель на объект может быть явно преобразован в указатель на объект другого типа.
Вот цитата из C (спасибо @StoryTeller), которая позволяет это:
Указатель на тип объекта может быть преобразован в указатель на другой тип объекта.
Они указывают, что один тип указателя может быть преобразован в другой тип указателя (и затем необязательно преобразован обратно) без последствий.
А вот цитата из POSIX, которая позволяет этот конкретный случай:
Структура sockaddr_in используется для хранения адресов для семейства интернет-адресов. Указатели на этот тип должны быть приведены приложениями к структуре sockaddr * для использования с функциями сокетов.
Так как эта функция ( bind
) является частью стандартной библиотеки C, все, что происходит внутри (в частности, разыменование приведенного к типу указателя), не имеет неопределенного поведения.
Чтобы ответить на более общий вопрос:
C и C ++ - два разных языка. Если что-то определено в C, но не в C ++, это определяется в C, но не в C ++. Никакая подразумеваемая совместимость между этими двумя языками не изменит это. Если вы хотите использовать код, который четко определен в C, но не определен в C ++, вам придется использовать компилятор C для компиляции этого кода.