如何在派生类中使用shared_from_this而不需要多余的RC操作?

时间:2014-12-10 21:45:18

标签: c++ c++11 shared-ptr

如果我想在继承自基类的层次结构中的派生类成员函数中创建shared_ptr<Derived>,我可以使用shared_from_thisstatic_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不做同样的事情?有没有办法让我编写上面的代码,不涉及不必要的引用操作?

1 个答案:

答案 0 :(得分:1)

看起来您将不得不依赖返回值优化,并希望它足够聪明,可以帮助您。

如果std::*_pointer_cast有超载接受转发引用(T&&),那么他们可以从临时转移所有权,这不会是一个问题。我认为这是C ++ 11以来对库的疏忽。