2014-12-10 7 views
6

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?

+2

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

+0

@Deduplicator: BTW nowy termin będzie prawdopodobnie "przekazywanie odniesienia" (zobacz wideo z CppCon 2014 z Herb Sutter) –

Odpowiedz

1

Wygląda na to, że będziesz musiał polegać na optymalizacji wartości zwrotu i masz nadzieję, że jest wystarczająco inteligentny, aby ci pomóc.

Jeśli std::*_pointer_cast miał przeciążenia, akceptując przekazywanie przekierowań (T&&), mogliby przenieść własność z tymczasowych i nie byłoby to problemem. Uważam to za niedopatrzenie w bibliotece od czasu C++ 11.

Powiązane problemy