다음을 통해 공유


경고 C26439

이러한 종류의 함수는 throw되지 않을 수 있습니다. 'noexcept'라고 선언합니다.

C++ 핵심 지침 F.6: 함수를 throw하지 않아야 하는 경우 선언합니다. noexcept

일부 작업은 예외를 throw해서는 안 됩니다. 구현은 신뢰할 수 있어야 하며 가능한 오류 조건을 정상적으로 처리해야 합니다. 예외를 사용하여 오류를 나타내면 안 됩니다. 이 규칙은 이러한 작업이 명시적으로 표시되지 noexcept않는 경우에 플래그를 지정합니다. 즉, 예외를 throw할 수 있으며 소비자는 안정성을 가정할 수 없습니다.

이러한 함수는 예외 안전 보장을 통해 함수 를 구현하기 위한 구성 요소로 자주 사용되므로 신뢰할 수 있어야 합니다. throw되는 이동 생성자는 STL(표준 템플릿 라이브러리) 컨테이너를 복사 작업으로 대체하여 런타임 성능을 줄입니다.

코드 분석 이름: SPECIAL_NOEXCEPT

설명

  • 특수한 종류의 작업:

    • 소멸자;
    • 이동 생성자 및 이동 할당 연산자;
    • 이동 의미 체계를 사용하는 표준 함수: std::movestd::swap.
  • 비표준 및 오래된 지정자는 다음과 같 throw() 거나 declspec(nothrow) 동일 noexcept하지 않습니다.

  • 명시적 지정자 noexcept(false) 이며 noexcept(true) 적절하게 준수됩니다.

예시

이 도구는 소멸 noexcept자를 제외한 모든 함수에 대해 경고합니다.

struct S
{
    ~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 동일한 구조를 데코레이팅하면 모든 경고가 제거됩니다.

struct S
{
    ~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*/}
};

참고 항목

C26455
C++ 핵심 지침 F.6