2011-01-20 25 views
5

Trong C++ Without Fear: Cẩm Nang Dành Cho Beginner khiến bạn cảm thấy thông minh cuốn sách, và trong chương (8), nó đề cập đến sau đây về reinterpret_castreinterpret_cast

.... cải từ một loại con trỏ (int) sang tên khác (char *). Bởi vì diễn viên thay đổi cách dữ liệu được trỏ tới được diễn giải, nó được gọi là reinterpret_cast, chứ không phải là static_cast. *

Bạn có thể mô tả đoạn này ở đây không? Đặc biệt là lý do cho cách thức hoạt động được đặt tên?

Cảm ơn.

+3

Đó là tên tuyệt vời cho sách! – Joe

+0

Có một câu hỏi khác hôm nay xuất phát từ cuốn sách này, và nó đã làm mọi thứ nhưng làm cho OP cảm thấy thông minh. –

+0

Ah, hah, đó là bạn. http://stackoverflow.com/questions/4746980/c-quitting-a-program Sự xấu hổ bạn đã chọn không đưa ra lời khuyên của tôi về việc nhận được một thực tế. –

Trả lời

6

Về cơ bản, reinterpret_cast diễn giải lại mẫu bit tại một vị trí cụ thể dưới dạng một loại khác.

Xem ví dụ ở đây: "Các nhà điều hành reinterpret_cast tạo ra một giá trị của một loại mới có các mẫu bit tương tự như đối số của nó" http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

Biến tĩnh chuyển đổi đối số thay vì chỉ diễn giải lại đối số. Bạn có thể thử điều này bằng static_casting và int để float và reinterpret_casting một int để float. Kết quả sẽ hoàn toàn khác.

+3

Nó không nhất thiết phải có cùng một mẫu bit. Có rất ít bảo đảm về 'reinterpret_cast' trong tiêu chuẩn. 5.2.10/3 nói rằng "Ánh xạ được thực hiện bởi' reinterpret_cast' được thực hiện xác định. [Ghi chú: nó có thể, hoặc có thể không, tạo ra một biểu diễn khác với giá trị ban đầu.] "Ngoài ra, một' reinterpret_cast' không thể đúc một ' int' thành 'float' (nó có thể truyền' int * 'thành' float * '). Bất kỳ việc triển khai nào diễn ra là vi phạm Tiêu chuẩn (5.2.10/1, câu cuối cùng), mặc dù nó có thể là một phần mở rộng đủ phổ biến. –

4

Không có gì lạ mắt, đây là. nó thực sự chỉ nhằm diễn giải lại một cái gì đó.

Từ tiêu chuẩn 5.3.10, reinterpret_cast là nhằm để phục vụ cho các trường hợp sau:

  • Một con trỏ có thể được chuyển đổi một cách rõ ràng cho bất kỳ loại không thể thiếu đủ lớn để giữ nó.
  • Giá trị của loại tích phân hoặc kiểu liệt kê có thể được chuyển đổi rõ ràng thành con trỏ.
  • Một con trỏ đến một hàm có thể được chuyển đổi một cách rõ ràng thành con trỏ đến một hàm của một kiểu khác.
  • Một con trỏ đến một đối tượng có thể được chuyển đổi một cách rõ ràng thành con trỏ đến một loại đối tượng khác.
  • Chuyển đổi con trỏ thành hàm thành con trỏ thành loại đối tượng hoặc ngược lại được hỗ trợ theo điều kiện.
  • Giá trị con trỏ null (4.10) được chuyển thành giá trị con trỏ null của loại đích.
  • Giá trị của loại "con trỏ tới thành viên X của loại T1" có thể được chuyển đổi thành giá trị của một loại khác "con trỏ thành thành viên của Y loại T2" nếu T1 và T2 là cả hai loại hàm hoặc cả hai loại đối tượng .
  • Biểu thức giá trị của loại T1 có thể được chuyển thành loại "tham chiếu đến T2" nếu biểu thức loại "con trỏ đến T1" có thể được chuyển đổi rõ ràng thành loại "con trỏ đến T2" bằng cách sử dụng reinterpret_cast. Đó là, một dàn diễn viên tài liệu tham khảo reinterpret_cast < T &> (x) có tác dụng tương tự như việc chuyển đổi * reinterpret_cast < T *> (& x) với các nhà khai thác built-in & và * (và tương tự cho reinterpret_cast < T & &> (x)).
+0

Bạn đã phạm sai lầm - đó là đoạn 5.2.10 trong tiêu chuẩn (bạn đã viết 5.3.10) –

+0

Không phải là số được phép thay đổi từ sửa đổi sang sửa đổi, btw? :) – Kos

Các vấn đề liên quan