Warnung C26418

Der Freigegebene Zeigerparameter wird nicht kopiert oder verschoben. Verwenden Sie stattdessen T* oder T&

C++-Kernrichtlinien: R.36: Nehmen Sie einen shared_ptr Widget>&-<Parameter, um auszudrücken, dass sie möglicherweise eine Verweisanzahl auf das Objekt beibehalten.

Wenn ein gemeinsam genutzter Zeigerparameter nach Wert oder verweis auf ein Konstantenobjekt übergeben wird, wird erwartet, dass die Funktion die Kontrolle über die Lebensdauer des Zielobjekts übernimmt, ohne dass sich dies auf den Aufrufer auswirkt. Der Code sollte entweder den freigegebenen Zeigerparameter in ein anderes freigegebenes Zeigerobjekt kopieren oder verschieben oder ihn an anderen Code übergeben, indem Sie Funktionen aufrufen, die freigegebene Zeiger akzeptieren. Andernfalls kann ein einfacher Zeiger oder Verweis machbar sein.

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

unnötige Schnittstellenkomplikation

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();
}

unnötige Schnittstellenkomplikation - vereinfacht

template<class T>
std::string to_string(const T *e)
{
    return !e ? null_string : e->to_string();
}