如果我想在继承自基类的层次结构中的派生类成员函数中创建shared_ptr<Derived>
,我可以使用shared_from_this
和static_pointer_cast
:
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。
shared_ptr<T>
有一个模板化的构造函数,它使用类型为shared_ptr<U>
的rvalues来执行移动,从而避免了进行refcount操作的需要。是否有某些原因static_pointer_cast
不做同样的事情?有没有办法让我编写上面的代码,不涉及不必要的引用操作?
答案 0 :(得分:1)
看起来您将不得不依赖返回值优化,并希望它足够聪明,可以帮助您。
如果std::*_pointer_cast
有超载接受转发引用(T&&
),那么他们可以从临时转移所有权,这不会是一个问题。我认为这是C ++ 11以来对库的疏忽。