경고 C26447
함수가 선언되었지만
noexcept
예외를 throw할 수 있는 함수 function_name 호출합니다(f.6).
C++ 핵심 지침:
F.6: 함수가 throw되지 않을 수 있는 경우 noexcept를 선언합니다.
설명
이 규칙은 다른 규칙인 C26440 DECLARE_NOEXCEPT 수정합니다. 이 규칙은 표시 noexcept
할 좋은 후보 함수를 찾으려고 시도합니다. 이 경우 일부 함수를 표시 noexcept
한 후에는 예외를 throw할 수 있는 다른 코드를 호출하지 않음으로써 계약을 유지해야 합니다.
- Microsoft C++ 컴파일러는 이미 함수 본문의 문과 같은
throw
간단한 위반을 처리합니다(C4297 참조). - 규칙은 함수 호출에만 중점을 둡니다. 그렇지 않고
constexpr
잠재적으로 예외를 throw할 수 있는 대상에 플래그를 지정합니다. 즉, throw 또는 throw()를 사용하여noexcept
__declspec(nothrow)
명시적으로 비던지기로 표시되지 않습니다. - 컴파일러에서 생성된 대상 함수는 예외 사양이 항상 컴파일러에서 제공되지 않으므로 노이즈를 줄이기 위해 건너뜁니다.
- 또한 검사er는 사용자가 구현
noexcept
할 것으로 예상되는 특수한 종류의 대상 함수를 건너뜁니다. 이 규칙은 C26439 SPECIAL_NOEXCEPT 의해 적용됩니다.
예시
#include <vector>
#include <string>
#include <istream>
std::vector<std::string> collect(std::istream& is) noexcept
{
std::vector<std::string> res;
for (std::string s; is >> s;) // C26447, `operator bool()` can throw, std::string's allocator can throw
res.push_back(s); // C26447, `push_back` can throw
return res;
}
함수 서명에서 제거하여 noexcept
이러한 경고를 해결할 수 있습니다.