"이러한 종류의 함수는 throw 할 수 없습니다."This kind of function may not throw. ' Noexcept '를 선언 합니다.Declare it 'noexcept'."

C++ Core Guidelines F. 6: 함수가 throw 할 수 없는 경우 noexcept으로 선언 합니다.C++ Core Guidelines F.6: If your function may not throw, declare it noexcept

일부 종류의 작업은 예외를 발생 시 키 지 않습니다.Some kinds of operations should never cause exceptions. 해당 구현은 안정적 이어야 하며 가능한 오류 조건을 정상적으로 처리 해야 합니다.Their implementations should be reliable and should handle possible errors conditions gracefully. 예외를 사용 하 여 실패를 표시 해서는 안 됩니다.They should never use exceptions to indicate failure. 이 규칙은 이러한 작업이 명시적으로 ' noexcept '로 표시 되지 않는 경우에 플래그를 지정할 수 있습니다. 즉, 예외를 throw 하 고 안정성에 대 한 가정을 전달할 수 없습니다.This rule flags cases where such operations are not explicitly marked as 'noexcept' which means that they may throw exceptions and cannot convey assumptions about their reliability.


  • 특수 한 종류의 작업은 다음과 같습니다.Special kinds of operations are the following:
    • destructors;
    • 기본 생성자default constructors;
    • 이동 생성자 및 이동 할당 연산자move constructors and move assignment operators;
    • 이동 의미 체계가 있는 표준 함수: std:: move 및 std:: swap.standard functions with move semantics: std::move and std::swap.
  • Throw () 또는 declspec (nothrow)와 같은 비표준 및 오래 된 지정자는 ' noexcept '와 같지 않습니다.Non-standard and outdated specifiers like throw() or declspec(nothrow) are not equivalent to 'noexcept'.
  • 명시적 지정자 noexcept (false) 및 noexcept (true)는 적절 하 게 적용 됩니다.Explicit specifiers noexcept(false) and noexcept(true) are respected appropriately.
  • Constexpr로 표시 된 작업에 대해서도 경고가 표시 될 수 있습니다.The warning may still appear for operations that are marked as constexpr. 이는 이후 릴리스에서 변경 될 수 있습니다.This may change in future releases.


소멸자를 제외한 모든 함수는 noexcept 없기 때문에 경고를 표시 합니다.All functions except the destructor will warn because they are missing noexcept.

struct S 
    S() {} // C26455, Default constructor may not throw. Declare it 'noexcept' 
    ~S() {}
    S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
    S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)

    S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
    S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'

Noexcept가 동일한 구조를 데코레이팅하 면 모든 경고가 제거 됩니다.With noexcept decorating the same structure, all warnings are removed.

struct S 
    S() noexcept {}
    ~S() {}
    S(S&& s) noexcept {/*impl*/}
    S& operator=(S&& s) noexcept {/*impl*/}

    S(const S& s) noexcept {/*impl*/}
    S& operator=(const S& s) noexcept {/*impl*/}