Trong C++ 11 này bị phản đối:Tại sao "ngoại lệ động" đảm bảo nguyên nhân trên không?
void foo() throw();
và thay thế bằng
void foo() noexcept;
Trong this article nó được giải thích rằng lý do cho điều này (trong số những người khác, đó đun sôi xuống để điều tương tự) là
Thông số kỹ thuật ngoại lệ C++ được kiểm tra trong thời gian chạy chứ không phải lúc biên dịch, vì vậy họ không có lập trình viên đảm bảo rằng tất cả ngoại lệ đã được xử lý.
Trong khi điều này không có ý nghĩa với tôi, tôi không hiểu tại sao throw()
được kiểm tra tự động ở nơi đầu tiên, hoặc tại sao noexcept
không bảo lãnh ngoại lệ khác ngoài gọi std::terminate
thay vì chồng bình thường nghiền (mà không phải là thực sự là một IMO đảm bảo chắc chắn).
Không thể kiểm tra xem có ngoại lệ được ném hay không trong thời gian biên dịch và không biên dịch nếu điều này xảy ra? Như tôi đã nhìn thấy nó, về cơ bản có ba trường hợp:
void foo() noexcept
{
// 1. Trivial case
throw myexcept();
// 2. Try-catch case
// Necessary to check whether myexcept is derived
// from exception
try
{
throw myexcept();
}
catch(exception const & e)
{}
// 3. Nested function call
// Recursion necessary
bar();
}
Với các mẫu trong C++ được khởi tạo cho tất cả các loại, biên dịch các ứng dụng sẽ mãi mãi anyways - vậy tại sao không thay đổi noexcept
để buộc các trình biên dịch để kiểm tra xem trường hợp ngoại lệ được ném trong thời gian biên dịch?
Khó khăn duy nhất tôi thấy là một hàm có thể hoặc không thể ném tùy thuộc vào trạng thái thời gian chạy - nhưng chức năng đó không được phép tự gọi chính nó là noexcept
theo ý kiến của tôi.
Tôi có thiếu thứ gì đó hoặc không có ý định tăng thêm thời gian biên dịch hay để dễ dàng thực hiện các nhà phát triển trình biên dịch?
Không có cách nào để trình biên dịch biết liệu, một hàm thư viện mà bạn gọi bên trong hàm của bạn có ném ngoại lệ hay không. – lapk
'throw()' là một sự bảo đảm mà trình biên dịch tạo ra cho bạn. 'noexcept' là một bảo đảm bạn thực hiện cho trình biên dịch. –
@PetrBudnik: Tất nhiên có, bất kỳ hàm nào không được đánh dấu là 'noexcept' có thể' ném'. –