noexcept_spec — noexcept 지정자
noexcept_spec — noexcept 지정자
noexcept 지정자는 함수가 예외를 던지지 않는다는 것을 선언하는 예외 명세예요.
함수가 예외를 던질 수 없다는 걸 컴파일러에 알려주면, 최적화에 도움이 되고 호출자에게도 계약을 전달해요. noexcept 함수에서 예외가 발생하면 std::terminate가 호출돼요.
출처: cppreference
본문
noexcept 지정자는 함수의 예외 명세를 지정해요.
문법 (Syntax)
noexcept
noexcept ( constant-expression )
throw ( type-list ) // C++17 까지의 동적 예외 명세
noexcept 형태
void f() noexcept; // 예외를 던지지 않음
void g() noexcept(true); // noexcept 와 동일
void h() noexcept(false); // 예외를 던질 수 있음
동작
noexcept함수 안에서 예외가 던져지면, 그 예외는 밖으로 전파되지 않아요.std::terminate가 호출돼요.- 함수가 예외를 던지지 않는다는 게 보장되면, 컴파일러가 스택 풀기 코드를 생략할 수 있어 성능이 좋아져요.
- STL은
noexcept여부로 이동 연산 등을 최적화해요.
noexcept 연산자와의 관계
noexcept(expr)은 연산자로서, expr이 예외를 던질 수 있는지 컴파일 타임에 검사해 bool을 반환해요. 이를 이용해 조건부로 noexcept를 지정할 수 있어요.
template <typename T>
void f() noexcept(noexcept(T())); // T 의 기본 생성자가 noexcept 면
예외 명세와 이동/소멸
- 소멸자 — C++11부터 기본적으로
noexcept. - 이동 생성자/대입 — 멤버가 모두 noexcept면 암시적으로
noexcept. 컨테이너가 이동을 사용하는지 결정에 영향.
동적 예외 명세 (throw, C++17까지)
throw(Type) 형태의 동적 예외 명세는 C++17에서 제거됐어요. 대신 noexcept가 사용돼요.
어디에 쓰나
- 자원 정리·종료 함수에
noexcept를 붙여 안전성을 보장 - 이동 연산에
noexcept를 붙여 컨테이너 성능·예외 안전성 확보
노트 (Notes)
noexcept를 위반하면terminate이므로, 예외를 던질 수 있는 함수엔 붙이면 안 돼요.noexcept는 함수 타입의 일부로, 함수 포인터 타입에 포함돼요 (C++17).