Isso é definido em C ++ e C. Ele não viola os regulamentos estritos de alias, pois não desrefere o ponteiro resultante.
Aqui está a citação do C ++ (graças a @interjay e @VTT) que permite isso:
Um ponteiro de objeto pode ser explicitamente convertido em um ponteiro de objeto de um tipo diferente.
Aqui está a citação de C (obrigado @StoryTeller) que permite isso:
Um ponteiro para um tipo de objeto pode ser convertido em um ponteiro para um tipo de objeto diferente.
Eles especificam que um tipo de ponteiro pode ser convertido em outro tipo de ponteiro (e opcionalmente convertido de volta) sem conseqüências.
E aqui está a citação do POSIX que permite este caso específico:
A estrutura sockaddr_in é usada para armazenar endereços para a família de endereços da Internet. Ponteiros para esse tipo devem ser convertidos por aplicativos para estruturar sockaddr * para uso com funções de soquete.
Como essa função ( bind
) faz parte da biblioteca padrão C, o que quer que ocorra dentro (especificamente, desreferenciando o ponteiro de conversão de tipo) não possui um comportamento indefinido.
Para responder à pergunta mais geral:
C e C ++ são duas linguagens diferentes. Se algo é definido em C, mas não em C ++, é definido em C, mas não em C ++. Nenhuma compatibilidade implícita entre os dois idiomas mudará isso. Se você deseja usar código bem definido em C, mas não definido em C ++, será necessário usar um compilador C para compilar esse código.