Ini didefinisikan dalam C ++ dan C. Ini tidak melanggar peraturan aliasing yang ketat karena tidak mengubah pointer yang dihasilkan.
Inilah kutipan dari C ++ (terima kasih kepada @interjay dan @VTT) yang memungkinkan ini:
Pointer objek dapat secara eksplisit dikonversi ke objek pointer dari tipe yang berbeda.
Inilah kutipan dari C (terima kasih @StoryTeller) yang memungkinkan ini:
Pointer ke tipe objek dapat dikonversi ke pointer ke tipe objek yang berbeda.
Ini menentukan bahwa satu tipe pointer dapat dikonversi ke tipe pointer lain (dan kemudian secara opsional dikonversi kembali) tanpa konsekuensi.
Dan inilah kutipan dari POSIX yang memungkinkan kasus khusus ini:
The sockaddr_in struktur digunakan untuk menyimpan alamat untuk keluarga alamat Internet. Pointer ke jenis ini harus dilemparkan oleh aplikasi ke struct sockaddr * untuk digunakan dengan fungsi soket.
Karena fungsi ini ( bind
) adalah bagian dari pustaka standar C, apa pun yang terjadi di dalam (khususnya, menandakan pointer tipe-dicor) tidak memiliki perilaku yang tidak ditentukan.
Untuk menjawab pertanyaan yang lebih umum:
C dan C ++ adalah dua bahasa yang berbeda. Jika sesuatu didefinisikan dalam C tetapi tidak dalam C ++, itu didefinisikan dalam C tetapi tidak dalam C ++. Tidak ada kompatibilitas yang tersirat antara kedua bahasa yang akan mengubah itu. Jika Anda ingin menggunakan kode yang didefinisikan dengan baik dalam C tetapi tidak terdefinisi dalam C ++, Anda harus menggunakan kompiler C untuk mengkompilasi kode itu.