예외 지정자는 exception specifiers are generally a terrible idea 때문에 사용되지 않는. noexcept
이 예외 지정자를 사용하는 것이 합리적으로 유용하기 때문에 추가되었습니다. 이 예외가 아닌 예외를 알리는 시점을 아는 것입니다. 따라서 이진 선택이됩니다. 즉, 던질 함수와 던지지 않을 함수입니다.
noexcept
은 noexcept
이 더 강력하기 때문에 throw()
이 아닌 모든 throw 지정자를 제거하는 것보다 추가되었습니다. noexcept
은 컴파일 타임이 부울로 해석되는 매개 변수를 가질 수 있습니다. 부울이 참이면 noexcept
이 붙습니다. 부울이 거짓이면 noexcept
이 붙지 않으며 함수가 throw 될 수 있습니다.
따라서,이 같은 작업을 수행 할 수 있습니다
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
이 CreateOtherClass
던져 예외를합니까? 만약 T
의 기본 생성자가 할 수 있습니다. 우리는 어떻게 말합니까? 이처럼 : 지정된 형태의 기본 생성자가 발생 IFF에 따라서
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
, CreateOtherClass()
가 발생합니다. 예외 지정자의 주요 문제점 중 하나 인 호출 스택을 전파 할 수없는 문제가 수정되었습니다.
throw()
으로는이 작업을 수행 할 수 없습니다.
[nice article] (http://akrzemi1.wordpress.com/2011/06/10/using-noexcept/)에 부합하면'noexcept'도 런타임 검사를 유발할 수 있습니다. 가장 큰 차이점은'noexcept'를 깨면'std :: terminate'가 발생하고'throw'를 깨면'std :: unexpected'가 발생한다는 것입니다. 또한 이러한 경우에 약간 다른 스택 풀기 동작. – Fiktik