2014-12-10 1 views
6

Если я хочу создать в производной функции члена класса в иерархии, который наследуется от базового класса с 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 не делает то же самое? И есть ли способ для меня написать вышеприведенный код, который не включает ненужные манипуляции с пересчетами?

+2

Да, все эти указатели-стрелки должны использовать универсальные ссылки ... http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast Серьезный надзор со стороны комитета. – Deduplicator

+0

@Deduplicator: BTW новый термин, скорее всего, будет «отправкой справки» (см. Некоторое видео CppCon 2014 of Herb Sutter) –

ответ

1

Похоже, вам придется полагаться на оптимизацию возвращаемой стоимости и надеяться, что она достаточно умна, чтобы помочь вам.

Если std::*_pointer_cast имеет перегрузки, принимающие ссылки на пересылку (T&&), тогда они могут передавать права собственности со временного времени, и это не будет проблемой. Я считаю это надзором в библиотеке с C++ 11.