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).

더 알아보기 (Learn more)

cppreference