Partage via


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’aide noexceptde , __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 case activée er 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.

Voir aussi

C26440 DECLARE_NOEXCEPT