Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tipo de função pode não lançar. Declare-o como 'noexcept'.
F.6: Se a sua função não deve ser lançada, declare-a noexcept
Algumas operações nunca devem lançar exceções. Suas implementações devem ser confiáveis e devem lidar com possíveis condições de erros graciosamente. Eles não devem usar exceções para indicar falha. Essa regra sinaliza casos em que tais operações não são explicitamente marcadas como noexcept, o que significa que elas podem gerar exceções e os consumidores não podem fazer suposições sobre sua confiabilidade.
É importante que essas funções sejam confiáveis, pois muitas vezes são usadas como blocos de construção para implementar funções com garantias de segurança de exceção. Um construtor move que lança forçará os contentores STL (Standard Template Library) a voltarem para operações de cópia, reduzindo o desempenho durante a execução.
Nome da análise de código: SPECIAL_NOEXCEPT
Observações
Tipos especiais de operações:
- destruidores;
- mover construtores e mover operadores de atribuição;
- funções padrão com semântica de movimento:
std::moveestd::swap.
Especificadores fora do padrão e desatualizados como
throw()oudeclspec(nothrow)não são equivalentes anoexcept.Especificadores explícitos
noexcept(false)enoexcept(true)são respeitados adequadamente.
Exemplo
A ferramenta avisa sobre todas as funções, exceto o destrutor, porque ele está a faltar 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'
};
Com noexcept a decorar a estrutura, todos os avisos são removidos.
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*/}
};
Ver também
C26455
F.6: Se a sua função não deve ser lançada, declare-a noexcept