specifiers ngoại lệ được phản vì exception specifiers are generally a terrible idea. noexcept
đã được thêm vì đó là cách sử dụng hợp lý một thông số ngoại lệ hữu ích: biết khi nào một hàm sẽ không ném một ngoại lệ. Vì vậy, nó trở thành một sự lựa chọn nhị phân: các chức năng sẽ ném và các chức năng mà sẽ không ném.
noexcept
đã được thêm thay vì chỉ xóa tất cả các thông số ném khác ngoài throw()
vì noexcept
mạnh hơn. noexcept
có thể có tham số mà thời gian biên dịch phân giải thành boolean. Nếu boolean là true, thì các gậy noexcept
. Nếu boolean là false, thì noexcept
không dính và hàm có thể ném.
Vì vậy, bạn có thể làm một cái gì đó như thế này:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Liệu CreateOtherClass
ngoại lệ ném? Có thể, nếu hàm tạo mặc định của T
có thể. Làm thế nào để chúng ta nói? Như thế này:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Do đó, CreateOtherClass()
sẽ ném iff của trình tạo mặc định của loại đã cho. Điều này khắc phục một trong những vấn đề lớn với các specifier ngoại lệ: không có khả năng truyền bá stack call.
Bạn không thể thực hiện việc này với throw()
.
Nguồn
2012-10-11 06:23:36
Accodring [this article] (http://akrzemi1.wordpress.com/2011/06/10/using-noexcept/) cũng 'noexcept' có thể phát sinh kiểm tra thời gian chạy. Sự khác biệt chính giữa chúng là việc phá vỡ 'noexcept' gây ra' std :: terminate' trong khi phá vỡ 'throw' gây ra' std :: unexpected'. Ngoài ra một hành vi thư giãn ngăn xếp hơi khác nhau trong những trường hợp này. – Fiktik