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

Kno*_*abe 6 c++ shared-ptr c++11

如果我想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()); }
};
Run Code Online (Sandbox Code Playgroud)

我关心的是static_pointer_cast通过lvalue-ref-to-const接受它的参数,所以当shared_ptr<Der>创建new时,控制块中的引用计数会递增.当shared_ptr<Base>返回的from shared_from_this被销毁时,控制块中的refcount将再次递减.我很惊讶地看到没有static_pointer_cast超载采用rvalue来避免操纵控制块中的refcount.

shared_ptr<T>有一个模板化的构造函数采用shared_ptr<U>执行移动的类型的rvalues ,从而避免了进行refcount 操作的需要.有什么理由static_pointer_cast不做同样的事情吗?是否有一些方法让我编写上面的代码,不涉及不必要的refcount操作?

Lig*_*ica 1

看来您将不得不依赖返回值优化,并希望它足够智能来帮助您。

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