경고 C26439
이러한 종류의 함수는 throw되지 않을 수 있습니다. 'noexcept'라고 선언합니다.
C++ 핵심 지침 F.6: 함수를 throw하지 않아야 하는 경우 선언합니다. noexcept
일부 작업은 예외를 throw해서는 안 됩니다. 구현은 신뢰할 수 있어야 하며 가능한 오류 조건을 정상적으로 처리해야 합니다. 예외를 사용하여 오류를 나타내면 안 됩니다. 이 규칙은 이러한 작업이 명시적으로 표시되지 noexcept
않는 경우에 플래그를 지정합니다. 즉, 예외를 throw할 수 있으며 소비자는 안정성을 가정할 수 없습니다.
이러한 함수는 예외 안전 보장을 통해 함수 를 구현하기 위한 구성 요소로 자주 사용되므로 신뢰할 수 있어야 합니다. throw되는 이동 생성자는 STL(표준 템플릿 라이브러리) 컨테이너를 복사 작업으로 대체하여 런타임 성능을 줄입니다.
코드 분석 이름: SPECIAL_NOEXCEPT
설명
특수한 종류의 작업:
- 소멸자;
- 이동 생성자 및 이동 할당 연산자;
- 이동 의미 체계를 사용하는 표준 함수:
std::move
및std::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*/}
};