Condividi tramite


Avviso C26447

La funzione viene dichiarata noexcept ma chiama la funzione function_name che può generare eccezioni (f.6).

Linee guida di base per C++:
F.6: se la funzione potrebbe non generare, dichiararla noexcept.

Osservazioni:

Questa regola modifica un'altra regola, C26440 DECLARE_NOEXCEPT, che tenta di trovare funzioni idonee per contrassegnare come noexcept. In questo caso, l'idea è che una volta contrassegnata una funzione come noexcept, deve mantenere il proprio contratto non richiamando altro codice che potrebbe generare eccezioni.

  • Il compilatore Microsoft C++ gestisce già violazioni semplici come throw le istruzioni nel corpo della funzione (vedere C4297).
  • La regola è incentrata solo sulle chiamate di funzione. Contrassegna le destinazioni che non constexpr sono e che possono potenzialmente generare eccezioni. In altre parole, non vengono contrassegnati in modo esplicito come non throw usando noexcept, __declspec(nothrow)o throw().
  • Le funzioni di destinazione generate dal compilatore vengono ignorate per ridurre il rumore perché le specifiche delle eccezioni non vengono sempre fornite dal compilatore.
  • Il controllo ignora anche tipi speciali di funzioni di destinazione che si prevede di implementare come noexcept. Questa regola viene applicata da C26439 SPECIAL_NOEXCEPT.

Esempio

#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;
}

È possibile correggere questi avvisi rimuovendo noexcept dalla firma della funzione.

Vedi anche

C26440 DECLARE_NOEXCEPT