Compartilhar 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 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 usando noexcept, __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.

Confira também

C26440 DECLARE_NOEXCEPT