Điều này được định nghĩa trong cả C ++ và C. Nó không vi phạm các quy định răng cưa nghiêm ngặt vì nó không làm mất đi con trỏ kết quả.
Đây là trích dẫn từ C ++ (nhờ @interjay và @VTT) cho phép điều này:
Một con trỏ đối tượng có thể được chuyển đổi rõ ràng thành một con trỏ đối tượng thuộc loại khác.
Đây là trích dẫn từ C (cảm ơn @StoryTeller) cho phép điều này:
Một con trỏ tới một loại đối tượng có thể được chuyển đổi thành một con trỏ thành một loại đối tượng khác.
Chúng xác định rằng một loại con trỏ có thể được chuyển đổi sang loại con trỏ khác (và sau đó tùy ý chuyển đổi trở lại) mà không có kết quả.
Và đây là trích dẫn từ POSIX cho phép trường hợp cụ thể này:
Các sockaddr_in cấu trúc được sử dụng để lưu trữ các địa chỉ cho gia đình địa chỉ Internet. Các con trỏ tới loại này sẽ được các ứng dụng chuyển sang struct sockaddr * để sử dụng với các chức năng của socket.
Vì hàm này ( bind
) là một phần của thư viện chuẩn C, nên bất cứ điều gì diễn ra bên trong (cụ thể là, bỏ hội thảo con trỏ đúc kiểu) không có hành vi không xác định.
Để trả lời câu hỏi chung chung hơn:
C và C ++ là hai ngôn ngữ khác nhau. Nếu một cái gì đó được định nghĩa trong C nhưng không phải trong C ++, thì nó được định nghĩa trong C nhưng không phải trong C ++. Không có sự tương thích ngụ ý giữa hai ngôn ngữ sẽ thay đổi điều đó. Nếu bạn muốn sử dụng mã được xác định rõ trong C nhưng không được xác định trong C ++, bạn sẽ phải sử dụng trình biên dịch C để biên dịch mã đó.