如何在派生类中使用shared_from_this而没有多余的RC操作?

问题描述:

如果我想创建一个在从基类继承的层次结构派生类成员函数shared_ptr<Derived>,我可以使用shared_from_thisstatic_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_from_this返回的shared_ptr<Base>被销毁时,控制块中的引用计数将再次递减。我很惊讶地发现,没有static_pointer_cast超载取得一个右值,可以避免在控制块中操作refcount。

shared_ptr<T>有一个模板化的构造函数,它执行shared_ptr<U>类型的右值来执行移动操作,从而避免需要进行引用操作。 static_pointer_cast不是做同样的事情吗?有没有办法让我编写上面的代码,不涉及不必要的引用操作?

+2

是的,所有这些指针应该使用通用引用... http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast委员会的严肃监督。 – Deduplicator 2014-12-10 22:04:51

+0

@Deduplicator:顺便说一句,新术语可能是“转发参考”(参见Herb Sutter的CppCon 2014的一些视频) – 2014-12-10 22:20:39

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

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