C26416 NO_RVALUE_REF_SHARED_PTRC26416 NO_RVALUE_REF_SHARED_PTR

« Le paramètre de pointeur partagé est passé par référence rvalue."Shared pointer parameter is passed by rvalue reference. Passer par valeur à la place. »Pass by value instead."

Les instructions C++ Core:C++ Core Guidelines:
R.34 : Prendre un shared_ptr paramètre pour exprimer qu’une fonction est propriétaire de la partieR.34: Take a shared_ptr parameter to express that a function is part owner

Il est généralement pas nécessaire de passer un pointeur partagé par référence rvalue.Passing a shared pointer by rvalue reference is usually unnecessary. Sauf si elle est une implémentation de la sémantique de déplacement d’un type pointeur partagé lui-même, les objets de pointeur partagé peuvent en toute sécurité passés par valeur.Unless it is an implementation of move semantics for a shared pointer type itself, shared pointer objects can be safely passed by value. À l’aide de référence rvalue peut également être une indication sur ce pointeur unique est plus approprié, car il clairement transfère la propriété unique à partir de l’appelant à l’appelé.Using rvalue reference may be also an indication that unique pointer is more appropriate since it clearly transfers unique ownership from caller to callee.

NotesRemarks

  • Cette vérification reconnaît std::shared_pointer et les types définis par l’utilisateur qui sont susceptibles de se comportent comme des pointeurs partagés.This check recognizes std::shared_pointer and user-defined types which are likely to behave like shared pointers. Les caractéristiques suivantes sont attendus pour défini par l’utilisateur de pointeurs partagés :The following traits are expected for user-defined shared pointers:
  • surchargé déréférencer ou l’accès au membre opérateurs (publics et non supprimé) ;overloaded dereference or member access operators (public and non-deleted);
  • constructeur de copie ou l’opérateur d’assignation de copie (public et non supprimé) ;copy constructor or copy assignment operator (public and non-deleted);
  • destructeur public qui n’est ni supprimée ni par défaut.public destructor which is neither deleted nor defaulted. Les destructeurs vides sont toujours comptabilisés comme défini par l’utilisateur.Empty destructors are still counted as user-defined.

ExempleExample

optimisation du constructeur douteuxquestionable constructor optimization

action::action(std::shared_ptr<transaction> &&t) noexcept // C26416
    : transaction_(std::move(t))
{}

action::action(std::shared_ptr<transaction> &t) noexcept  // also C26417 LVALUE_REF_SHARED_PTR
    : transaction_(t)
{}

ExempleExample

optimisation du constructeur douteux - simplifiéequestionable constructor optimization - simplified

action::action(std::shared_ptr<transaction> t) noexcept
    : transaction_(std::move(t))
{}