Avertissement C26418
Le paramètre de pointeur partagé n’est pas copié ni déplacé. Utilisez plutôt T* ou T>.
Instructions principales C++ : R.36 : Prendre un paramètre const shared_ptr<widget>> pour exprimer qu’il peut conserver un nombre de références à l’objet
Si un paramètre de pointeur partagé est passé par valeur ou par référence à un objet constant, la fonction est censée prendre le contrôle de la durée de vie de l’objet cible sans affecter l’appelant. Le code doit copier ou déplacer le paramètre de pointeur partagé vers un autre objet de pointeur partagé, ou le transmettre à d’autres codes en appelant des fonctions qui acceptent des pointeurs partagés. Sinon, un pointeur ou une référence simple peut être réalisable.
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.
Exemples
complications d’interface inutiles
template<class T>
std::string to_string(const std::shared_ptr<T> &e) // C26418, also C26415 SMART_PTR_NOT_NEEDED
{
return !e ? null_string : e->to_string();
}
complications d’interface inutiles - simplifiée
template<class T>
std::string to_string(const T *e)
{
return !e ? null_string : e->to_string();
}