Share via


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.

Hinweise

  • 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.

Beispiele

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))
{}