Đối với một int để Enum dàn diễn viên, một ngoại lệ là không được ném ngay cả khi nó không hợp lệ. Tôi có thể dựa vào hành vi này không? Mã sau hoạt động.
enum animal { CAT = 1, DOG = 2 };
int y = 10;
animal x = static_cast<animal>(y);
Trên thực tế, sự đếm không bị giới hạn vào danh sách các kiểu liệt kê trong định nghĩa của họ, và đó không phải chỉ là một số những đứa lạ, nhưng một đặc điểm cố tình sử dụng enums - xem xét mức độ giá trị liệt kê thường ORed với nhau để đóng gói chúng thành một giá trị duy nhất hoặc giá trị 0 được chuyển khi không có liệt kê nào.
Trong C++ 03, nó không nằm dưới sự kiểm soát lập trình rõ ràng như thế nào một số nguyên sao lưu sẽ được trình biên dịch sử dụng, nhưng phạm vi được đảm bảo khoảng 0 và liệt kê liệt kê rõ ràng.
Vì vậy, không nhất thiết đúng là 10 không phải là giá trị có thể lưu trữ hợp lệ cho số animal
. Ngay cả khi giá trị sao lưu không đủ lớn để lưu trữ giá trị tích phân bạn đang cố gắng chuyển đổi sang animal
, có thể áp dụng chuyển đổi thu hẹp - thường thì điều này sẽ sử dụng nhiều bit quan trọng nhất mà kiểu sao lưu có thể giữ, loại bỏ bất kỳ bit thứ tự cao bổ sung nào, nhưng để biết chi tiết, hãy kiểm tra Chuẩn. Trong thực tế, hầu hết các trình biên dịch C++ 03 hiện đại trên PC và phần cứng máy chủ mặc định sử dụng (32 bit) int
để quay lại điều tra, điều này tạo điều kiện cho các hàm trong thư viện C trong đó 32 bit là chuẩn.
Tôi sẽ không bao giờ mong đợi một trình biên dịch để ném ngoại lệ khi bất kỳ giá trị nào được shoehorned vào một enum sử dụng static_cast<>
.
Nguồn
2012-07-19 00:11:03
Tùy thuộc vào loại nguồn và đích, kết quả của static_cast có thể là hành vi không xác định, có thể bao gồm việc ném ngoại lệ. –
Nó có thể là tốt hơn để hỏi, nó có thể ném một ngoại lệ trong khi chương trình đang ở trong trạng thái được xác định rõ. Tất nhiên UB về lý thuyết có thể ném một ngoại lệ, nhưng UB về mặt lý thuyết có thể định dạng ổ cứng của bạn. – Wyzard
@JerryCoffin: Tiêu chuẩn 5.2.9 chỉ cho biết một số kết quả có thể không xác định và trong khi việc sử dụng tiếp theo các kết quả như vậy có thể có hành vi không xác định, không có đề cập rõ ràng về hành vi chưa được xác định từ chính diễn viên đó. Tui bỏ lỡ điều gì vậy? –