Partilhar via


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 não deve lançar exceções, declare-a noexcept

Observações

Esta regra altera outra regra, C26440 DECLARE_NOEXCEPT, que tenta encontrar funções que são bons candidatos para marcar como noexcept. Neste caso, a ideia é que, uma vez que você marque alguma função como noexcept, ela deve manter seu contrato não invocando outro código que possa gerar exceções.

  • O compilador Microsoft C++ já lida com violações diretas, como throw declarações no corpo da função (consulte C4297).
  • A regra concentra-se apenas em chamadas de função. Ele sinaliza os alvos que não são constexpr e que podem lançar exceções. Em outras palavras, eles não são marcados explicitamente como não-lançamento usando noexcept, __declspec(nothrow), ou throw().
  • As funções de destino geradas pelo compilador são ignoradas para reduzir o ruído, uma vez que 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 que você implemente, pois noexceptesta regra é imposta pelo 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.

Ver também

C26440 DECLARE_NOEXCEPT