Các tiêu chuẩn không cấm sử dụng của nó trong vòng [basic.start.main], và, trong khi buộc tất cả triển khai để hỗ trợ ít nhất int main() {/*...*/ }
và int main(int argc, char* argv[]) {/*...*/}
, không giới hạn việc triển khai cho hai khai báo đó (3.6.1, đoạn 2).
Từ đó trong sự cô lập, nó sẽ xuất hiện ít nhất là nó là hợp pháp, mặc dù tất nhiên chỉ liên quan đến khai báo hàm, chứ không chỉ định nghĩa hàm.
Đọc trên, [except.handle], đoạn 13 tiểu bang sau đây:
Exceptions ném vào destructors của các đối tượng với dung lượng tĩnh thời gian hoặc trong nhà xây dựng của các đối tượng không gian tên-phạm vi không bắt bởi một function-try-block trên main(). (15,3 para. 13)
Nó làm cho đề cập cụ thể của một chức năng-thử-block đặt trên main()
, mà mạnh mẽ ngụ ý rằng một cấu trúc như vậy là hợp pháp và đã xác định hành vi. Thêm vào thông tin rằng main()
chỉ đặc biệt trong tên và kiểu trả về của nó, và việc triển khai có thể không quá tải để thay đổi bất kỳ hành vi nào, tạo ra một trường hợp khá mạnh mẽ hoạt động theo kiểu bình thường ngoại trừ khi được chú ý đặc biệt . Nói cách khác, có, nó là hợp pháp và được xác định rõ.
Các bài viết trên blog tôi cung cấp trong phiên bản đầu tiên của câu trả lời này thực sự làm một công việc tốt để minh họa các quy tắc được đưa ra bởi blockquote trên, vì vậy tôi sẽ retain the link to it, mặc dù nó không trực tiếp thảo luận về vấn đề này trong OP của câu hỏi.
Về nhận xét về OP, bạn có thể phát hành báo cáo trả lại trong một khối chức năng -try-block và [ngoại trừ.xử lý] có điều này để nói:
Chảy ra khỏi cuối khối chức năng thử tương đương với trả lại không có giá trị; điều này dẫn đến hành vi không xác định trong hàm trả về giá trị (6.6.3). (15.3 đoạn 15)
Nếu bạn đang ở trong khối bị chặn ở cuối main
, bạn sẽ không chảy qua thân của hàm (đây sẽ là khối thử trong trường hợp này) , vì vậy quy tắc tự động gọi chính là return 0;
khi lưu chuyển không áp dụng. Bạn cần trả lại một số int
(có thể là một mã lỗi) để tránh không trở thành không xác định.
Câu hỏi học thuật thú vị, mặc dù tôi không chắc nó có nhiều sử dụng thực tế. http://stackoverflow.com/a/620817/10077 –
Pháp lý? Về mặt kỹ thuật, hầu hết các trình biên dịch sẽ hỗ trợ nó. Được xác định rõ? Không thực sự như tôi chắc chắn không thể nghĩ ra bất kỳ lý do lành mạnh nào để làm điều này. – AJG85
@ AJG85 - Tôi có nghĩa là được định nghĩa rõ ràng theo nghĩa "gọi không phải hành vi không xác định, cũng không thực hiện hành vi được xác định", không phải trong "cũng được thử nghiệm trong việc triển khai phổ biến" cách – Flexo