Если я хочу создать в производной функции члена класса в иерархии, который наследуется от базового класса с shared_ptr<Derived>
, я могу использовать shared_from_this
и static_pointer_cast
:Как я могу использовать shared_from_this в производном классе без лишних манипуляций с 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()); }
};
Меня беспокоит то, что static_pointer_cast
принимает аргумент по lvalue- ref-to-const, поэтому, когда создается новый shared_ptr<Der>
, счетчик ссылок в блоке управления увеличивается. Когда shared_ptr<Base>
, возвращенный с shared_from_this
, будет уничтожен, пересчет в контрольном блоке будет уменьшен снова. Я был удивлен, увидев, что перегрузка static_pointer_cast
имеет значение rvalue, которое позволит избежать необходимости манипулировать refcount в блоке управления.
имеет шаблонный конструктор, принимающий rvalues типа shared_ptr<U>
, который выполняет ходы, избегая при этом необходимости делать манипуляции с refcount. Есть ли причина, по которой static_pointer_cast
не делает то же самое? И есть ли способ для меня написать вышеприведенный код, который не включает ненужные манипуляции с пересчетами?
Да, все эти указатели-стрелки должны использовать универсальные ссылки ... http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast Серьезный надзор со стороны комитета. – Deduplicator
@Deduplicator: BTW новый термин, скорее всего, будет «отправкой справки» (см. Некоторое видео CppCon 2014 of Herb Sutter) –