Avertissement C26417
Le paramètre de pointeur partagé est passé par référence et n’est pas réinitialisé ou réaffecté. Utilisez plutôt T* ou T>.
Instructions principales C++ : R.35 : Prendre un<shared_ptr widget>> pour exprimer qu’une fonction peut renvoyer le pointeur partagé
Le passage de pointeurs partagés par référence peut être utile dans les scénarios où le code appelle la cible de l’objet pointeur intelligent, et son appelant s’attend à voir ces mises à jour. L’utilisation d’une référence uniquement pour réduire les coûts de transmission d’un pointeur partagé est discutable. Si le code appelé accède uniquement à l’objet cible et ne gère jamais sa durée de vie, il est plus sûr de passer un pointeur brut ou une référence, plutôt que d’exposer les détails de gestion des ressources.
Notes
Cette vérification reconnaît et les
std::shared_pointer
types définis par l’utilisateur susceptibles de se comporter comme des pointeurs partagés. Les caractéristiques suivantes sont attendues pour les pointeurs partagés définis par l’utilisateur :les opérateurs d’accès aux membres ou de déréférencement surchargés (publics et non supprimés) ;
un constructeur de copie ou un opérateur d’affectation de copie (public et non supprimé) ;
destructeur public qui n’est pas supprimé ou par défaut. Les destructeurs vides sont toujours comptabilisés comme définis par l’utilisateur.
L’action de réinitialisation ou de réaffectation est interprétée de manière plus générique :
tout appel à une fonction non constante sur un pointeur partagé peut potentiellement réinitialiser le pointeur ;
tout appel à une fonction qui accepte une référence à un pointeur partagé non constant peut potentiellement réinitialiser ou réaffecter ce pointeur.
Exemples
complications d’interface inutiles
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
complications d’interface inutiles - simplifiée
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}