Wenn ich ein shared_ptr<Derived>
in einer abgeleiteten Klasse Member-Funktion in einer Hierarchie erstellen möge, die von einer Basisklasse erbt, kann ich shared_from_this
und static_pointer_cast
:Wie kann ich shared_from_this in einer abgeleiteten Klasse ohne überflüssige RC-Manipulationen verwenden?
class Base: public std::enable_shared_from_this<Base> {
};
class Der: public Base {
public:
std::shared_ptr<Der> make_SP_to_Me()
{ return std::static_pointer_cast<Der>(shared_from_this()); }
};
Meine Sorge ist, dass static_pointer_cast
ihr Argument akzeptiert von lvalue- ref-to-const, wenn also der neue shared_ptr<Der>
erstellt wird, wird der Referenzzähler im Steuerblock inkrementiert. Wenn die shared_ptr<Base>
, die von shared_from_this
zurückgegeben wird, zerstört wird, wird der Refcount im Steuerblock wieder dekrementiert. Ich war überrascht zu sehen, dass es keine static_pointer_cast
Überladung gibt, die einen rvalue nimmt, der die Notwendigkeit vermeiden würde, den Refcount im Kontrollblock zu manipulieren.
shared_ptr<T>
hat einen templatisierten Konstruktor, der rvalues des Typs shared_ptr<U>
verwendet, der Bewegungen ausführt, wodurch die Notwendigkeit von Refcount-Manipulationen vermieden wird. Gibt es einen Grund, dass static_pointer_cast
nicht das Gleiche tut? Und gibt es eine Möglichkeit für mich, den obigen Code zu schreiben, der keine unnötigen Refcount-Manipulationen beinhaltet?
Ja, alle diese Zeiger-Casts sollten universelle Referenzen verwenden ... http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast Eine ernsthafte Aufsicht durch das Komitee. – Deduplicator
@Deduplicator: BTW der neue Begriff wird wahrscheinlich "Weiterleitung Verweis" sein (siehe ein Video von CppCon 2014 von Herb Sutter) –