Avertissement C26447
La fonction est déclarée
noexcept
, mais appelle la fonction function_name qui peut lever des exceptions (f.6).
Recommandations principales en C++ :
F.6 : Si votre fonction peut ne pas lever, déclarez-la sans-doute.
Notes
Cette règle modifie une autre règle, C26440 DECLARE_NOEXCEPT, qui tente de trouver des fonctions qui sont de bons candidats à marquer comme noexcept
. Dans ce cas, l’idée est qu’une fois que vous marquez une fonction comme noexcept
, il doit conserver son contrat en n’appelant pas d’autre code qui peut lever des exceptions.
- Le compilateur Microsoft C++ gère déjà des violations simples telles que
throw
des instructions dans le corps de la fonction (voir C4297). - La règle se concentre uniquement sur les appels de fonction. Il signale les cibles qui ne sont pas
constexpr
et qui peuvent potentiellement lever des exceptions. En d’autres termes, elles ne sont pas marquées explicitement comme non levées à l’aidenoexcept
de ,__declspec(nothrow)
ou throw(). - Les fonctions cibles générées par le compilateur sont ignorées pour réduire le bruit, car les spécifications d’exception ne sont pas toujours fournies par le compilateur.
- Le vérificateur ignore également les types spéciaux de fonctions cibles que nous vous attendons à implémenter comme
noexcept
; cette règle est appliquée par C26439 SPECIAL_NOEXCEPT.
Exemple
#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;
}
Vous pouvez corriger ces avertissements en supprimant noexcept
la signature de fonction.