Compartilhar via


Aviso C26439

Esse tipo de função pode não ser lançada. Declare-o 'noexcept'.

F.6: Se 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 normalmente. Eles não devem usar exceções para indicar falha. Essa regra sinaliza casos em que essas 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 geralmente são usadas como blocos de construção para implementar funções com garantias de segurança de exceção. Um construtor de movimentação que lança forçará os contêineres STL (Biblioteca de Modelos Padrão) a voltar para operações de cópia, reduzindo o desempenho do runtime.

Nome da análise de código: SPECIAL_NOEXCEPT

Comentários

  • Tipos especiais de operações:

    • destruidores;
    • operadores de construtores de movimento e de atribuição de movimento;
    • Funções padrão com semântica de movimentação: 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 e noexcept(false) são respeitados noexcept(true) adequadamente.

Exemplo

A ferramenta avisa sobre todas as funções, exceto o destruidor, porque elas estão ausentes 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 decoração da mesma 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*/}
};

Confira também

C26455
F.6: Se sua função não deve ser lançada, declare-a noexcept