C++11 - noexcept

noexcept 키워드 목적.

1) throw 키워드에 의한 예외 사양 대체. 함수가 어떤 예외를 던질 가능성이 있는지를 열거하는 것이 아니라 예외를 던질 가능성이 있는지 없는지만 지정한다. 예외를 던질 가능성이 있는 함수에는 noexcept(false)을 지정하고, 예외를 던질 가능성이 없는 함수에는 noexcept(true) 또는 noexcept를 지정한다:

class Integer {
  int value_ = 0;

public:
  // getValue() 멤버 함수는 예외를 던지지 않는다
  int getValue() const noexcept
  {
    return value_;
  }
};

2) 식이 예외를 던질 가능성이 있는지를 판정하는 연산자이다. noexcept(f(arg) 처럼 noexcept 연산자에 식을 지정함으로써 이 식이 예외를 던질 가능성이 있는지를 컴파일 시 상수 bool 값으로 받는다. 즉, 함수에 대해서 지정된 noexcept 정보를 얻는다:

Integer x;
static_assert( noexcept(x.getValue()), "getValue() function never throw exception" );

용도

noexcept는 대표적으로는 다음 2가지 용도로 사용할 수 있다

  • 퍼포먼스 향상: 예외를 던지지 않는다는 보장이 있으므로 컴파일러는 예외 던지기에 따른 스택 반전을 위해 스택을 확보할 필요가 없어진다
  • 예외를 절대 던지지 않는 강한 예외 안전성 보증(No-throw guarantee)




struct X {
  ~X(); // default 생성자는 default로 noexcept(true)

  // 예외를 던질 가능성이 있다
  // ※ std::vector의 복사 생성자는 예외를 던진다
  std::vector<T> getVector() const;
//std::vector<T> getVector() const noexcept(false);

  // 예외를 던지지 않는다
  int getValue() const noexcept;
//int getValue() const noexcept(true);
};




출처: https://cpprefjp.github.io/lang/cpp11/noexcept.html


이 글은 2017-02-27에 작성되었습니다.