Aviso C26447
A função é declarada
noexcept
, mas chama a função function_name, que pode gerar exceções (f.6).
Diretrizes Principais do C++:
F.6: se a sua função pode não gerar exceções, declare-a como noexcept.
Comentários
Esta regra altera outra regra, C26440 DECLARE_NOEXCEPT, que tenta encontrar funções que são boas candidatas para serem marcadas como noexcept
. Nesse caso, a ideia é que, depois de marcar alguma função como noexcept
, ela precisa manter o próprio contrato, não invocando outro código que possa gerar exceções.
- O compilador do Microsoft C++ já lida com violações simples, como
throw
instruções no corpo da função (confira C4297). - A regra se concentra apenas em chamadas de função. Ele sinaliza destinos que não são
constexpr
e que podem potencialmente gerar exceções. Em outras palavras, eles não são marcados explicitamente como não geradores usandonoexcept
,__declspec(nothrow)
ou throw(). - As funções de destino geradas pelo compilador são ignoradas para reduzir o ruído, pois as especificações de exceção nem sempre são fornecidas pelo compilador.
- O verificador também ignora tipos especiais de funções de destino que esperamos implementar como
noexcept
; essa regra é imposta por C26439 SPECIAL_NOEXCEPT.
Exemplo
#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;
}
Você pode corrigir esses avisos removendo noexcept
da assinatura da função.