Warnung C26416
Der Freigegebene Zeigerparameter wird durch Rvalue-Verweis übergeben. Übergeben Sie stattdessen den Wert.
C++ Core Guidelines: R.34: Nehmen Sie einen shared_ptr<Widgetparameter> , um auszudrücken, dass eine Funktion Teilbesitzer ist
Das Übergeben eines freigegebenen Zeigers durch rvalue-Verweis ist selten erforderlich. Sofern es sich nicht um eine Implementierung der Bewegungssemantik für einen freigegebenen Zeigertyp selbst handelt, können freigegebene Zeigerobjekte sicher nach Wert übergeben werden. Die Verwendung des Referenzwerts kann auch ein Hinweis darauf sein, dass ein eindeutiger Zeiger besser geeignet ist, da er eindeutig den Besitz des Anrufers an den Angerufenen überträgt.
Diese Überprüfung erkennt
std::shared_pointer
und benutzerdefinierte Typen, die sich wahrscheinlich wie freigegebene Zeiger verhalten. Für benutzerdefinierte freigegebene Zeiger werden die folgenden Merkmale erwartet:überladene Ableitungen oder Memberzugriffsoperatoren (öffentlich und nicht gelöscht);
einen Kopierkonstruktor oder einen Zuweisungsoperator (öffentlich und nicht gelöscht);
ein öffentlicher Destruktor, der nicht gelöscht oder standardmäßig festgelegt ist. Leere Destruktoren werden weiterhin als benutzerdefinierte Gezählt.
Fragwürdige Konstruktoroptimierung:
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)
{}
Fragwürdige Konstruktoroptimierung - vereinfacht:
action::action(std::shared_ptr<transaction> t) noexcept
: transaction_(std::move(t))
{}