Jeśli chcę stworzyć shared_ptr<Derived>
w pochodnej funkcji składowej klasy w hierarchii, która dziedziczy z klasy bazowej, można użyć shared_from_this
i static_pointer_cast
:Jak mogę użyć shared_from_this w klasie pochodnej bez zbędnych manipulacji RC?
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()); }
};
Moim problemem jest to, że static_pointer_cast
akceptuje swój argument przez lvalue- ref-to-const, więc po utworzeniu nowego shared_ptr<Der>
licznik referencji w bloku sterującym jest zwiększany. Kiedy shared_ptr<Base>
powróci z shared_from_this
zostanie zniszczony, ponowne przeliczenie w bloku sterującym zostanie ponownie zmniejszone. Byłem zaskoczony, aby zobaczyć, że nie ma przeciążenia, biorąc rwartość, która pozwoliłaby uniknąć konieczności manipulowania refcount w bloku kontrolnym.
ma konstruktora z szablonem, który przyjmuje wartości typu shared_ptr<U>
, które wykonują ruchy, unikając w ten sposób konieczności manipulowania licznikiem. Czy jest jakiś powód, dla którego static_pointer_cast
nie robi to samo? Czy jest jakiś sposób, aby napisać powyższy kod, który nie wiąże się z niepotrzebnymi manipulacjami?
Tak, wszystkie te wskaźniki muszą używać uniwersalnych odniesień ... http://pl.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast Poważne niedopatrzenie ze strony komisji. – Deduplicator
@Deduplicator: BTW nowy termin będzie prawdopodobnie "przekazywanie odniesienia" (zobacz wideo z CppCon 2014 z Herb Sutter) –