Partilhar via


Aviso C26439

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::move e std::swap.
  • Especificadores fora do padrão e desatualizados como throw() ou declspec(nothrow) não são equivalentes a noexcept.

  • Especificadores explícitos noexcept(false) e noexcept(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