2014-12-10 3 views
6

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?

+2

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

+0

@Deduplicator: BTW der neue Begriff wird wahrscheinlich "Weiterleitung Verweis" sein (siehe ein Video von CppCon 2014 von Herb Sutter) –

Antwort

1

Es sieht so aus, als müssten Sie sich auf die Optimierung der Rückgabewerte verlassen und hoffen, dass es schlau genug ist, Ihnen zu helfen.

Wenn std::*_pointer_cast Überladungen haben, die Forwarding-Referenzen akzeptieren (T&&), könnten sie Eigentumsrechte von Provisorien übertragen und dies wäre kein Problem. Ich betrachte es als ein Versehen in der Bibliothek seit C++ 11.

Verwandte Themen