noexcept
Modern C++에 적응하기
Effective Modern C++ Chapter 3. noexcept
noexcept
C++11에서 함수가 예외를 방출(emit)[1]하지 않는다면, 함수를 noexcept
로 선언할 수 있다.
noexcept
는 함수 예외 안정성의 명시적 보장이다. 이를 통해서 클라이언트는 함수를 호출할때 해당 함수가 예외 안정성을 보장하는지 알 수 있다.
noexcept
는 컴파일러가 코드를 최적화하는데 참고하는 고려사항 중 하나이다.
C++98에서 예외 안정성이 보장된 함수(int f(int x) throw();
)에서 예외가 방출되면(즉, 예외 명세가 위반되면), 호출 스택이 해당 함수를 호출한 지점에 도착할 때 까지 풀리며(unwind), 그 지점에서 몇 가지 동작 후 프로그램이 종료된다.
반면 C++11에서 같은 예외 명세를 가진 함수(int f(int x) noexcept;
)의 예외 명세가 위반되면, 프로그램이 종료되기 전에 호출 스택이 풀릴수도있고 아닐 수도 있다.[2]