2013-02-17 26 views
6

Tôi không chắc chắn nếu nó đã được hỏi trước đó, nhưng phải có được tôi tin. Hãy xem xét một dòng đơn giản cho sự khởi đầu của câu hỏi:Làm cách nào để static_cast có thể truyền int sang char chứ không phải reinterpret_cast?

int a ; 
char b = reinterpret_cast<char> (a); 

Tôi hiểu reinterpret_cast giải thích các mẫu bit của loại x as type y, ofcouse nó không nên làm việc do kích thước không phù hợp và thực sự nó không.

Bây giờ xem xét việc này một mã số:

int a ; 
char b = static_cast<char> (a); 

này hoạt động! . Bây giờ câu hỏi của tôi là nó có thể hoạt động như thế nào? Tôi có nghĩa là trình biên dịch tắt các bit? . Tôi chắc chắn là sizeof(char) < sizeof(int). Nếu điều đó, reinterpret_cast cũng nên hoạt động bằng cùng một kỹ thuật?

Trả lời

6

Có một chuyển đổi được xác định rõ ràng từ int đến char; đó là những gì static_cast làm. Trong thực tế, bạn không cần dàn diễn viên; bạn chỉ có thể sử dụng bài tập ở đây. Mặt khác, reinterpret_cast giả sử rằng các bit trong một đối tượng của một kiểu đại diện cho một đối tượng của một kiểu khác; đối với một số loại không sao (nhiều hay ít), nhưng không có cách nào hợp lý để giả vờ rằng các bit trong một int có thể được sử dụng như các bit trong một char mà không áp dụng một chuyển đổi, và reinterpret_cast không làm điều đó.

+0

* "... và' reinterpret_cast' không làm điều đó "*. mà một phần của spec nói rằng? – Nawaz

+4

@Nawaz, phần xác định chuyển đổi được cho phép bởi 'reinterpret_cast', hiển nhiên, bạn mong đợi nó nói ở đâu? [expr.reinterpret.cast] "Chuyển đổi có thể được thực hiện một cách rõ ràng bằng cách sử dụng' reinterpret_cast' được liệt kê dưới đây. ** No chuyển đổi khác có thể được thực hiện rõ ràng bằng cách sử dụng 'reinterpret_cast'. **" –

+0

Mặc dù bề rộng có vẻ như tên của nó, ' reinterpret_cast' khá hạn chế. Như @JonathanWakely chỉ ra, có một danh sách những điều nó có thể làm (về cơ bản những thứ liên quan đến con trỏ và tài liệu tham khảo) và không có gì khác được cho phép. 5.2.10 [expr.reinterpret.cast]. Không giống như một diễn viên kiểu C ... –

3

static_cast có thể buộc chuyển đổi được xác định xảy ra hoặc có thể đảo ngược chuyển đổi được xác định (ngoài việc thêm hoặc xóa const/volatile). Bạn nghĩ rằng reinterpret_cast là một số siêu diễn viên có thể làm bất cứ điều gì. Đó không phải là tình huống. Nó có một tập hợp các chuyển đổi được xác định.

Nó có thể chuyển đổi con trỏ của một loại thành con trỏ của một loại khác (miễn là const/volatile được bảo tồn). Nó có thể tương tự như vậy để tham khảo. Nó có thể đúc con trỏ đến các loại tích phân và ngược lại.

Ngoài ra, nó KHÔNG làm bất cứ điều gì và chương trình của bạn không được định dạng tốt.

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