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 usandonoexcept
,__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.