Esto se define tanto en C ++ como en C. No viola las estrictas regulaciones de alias ya que no desreferencia el puntero resultante.
Aquí está la cita de C ++ (gracias a @interjay y @VTT) que permite esto:
Un puntero de objeto puede convertirse explícitamente en un puntero de objeto de un tipo diferente.
Aquí está la cita de C (gracias @StoryTeller) que permite esto:
Un puntero a un tipo de objeto puede convertirse en un puntero a un tipo de objeto diferente.
Estos especifican que un tipo de puntero se puede convertir a otro tipo de puntero (y luego, opcionalmente, volver a convertir) sin consecuencias.
Y aquí está la cita de POSIX que permite este caso específico:
La estructura sockaddr_in se usa para almacenar direcciones para la familia de direcciones de Internet. Los apuntadores a este tipo serán emitidos por aplicaciones para estructurar sockaddr * para su uso con funciones de socket.
Como esta función ( bind
) es parte de la biblioteca estándar de C, lo que sea que ocurra dentro (específicamente, desreferenciar el puntero con tipo de letra) no tiene un comportamiento indefinido.
Para responder a la pregunta más general:
C y C ++ son dos lenguajes diferentes. Si algo se define en C pero no en C ++, se define en C pero no en C ++. Ninguna compatibilidad implícita entre los dos idiomas cambiará eso. Si desea utilizar código bien definido en C pero indefinido en C ++, deberá utilizar un compilador de C para compilar ese código.