为什么我们使用 enable_shared_from_this 模板?

Why do we use enable_shared_from_this template?

最近遇到了std::enable_shared_from_this<T>模板,和Boost版本一样
所以它描述了以下示例代码:

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

通过f()?
创建shared_ptr的原因是什么 shared_ptr<Y> p(new Y); 怎么了?

Whats wrong with shared_ptr p(new Y);?

它没有任何问题,唯一的问题是你可能没有在 class Y 的成员中使用它,有时你想要 return std::shared_ptr 的成员对自己。 std::shared_ptr<Y>( this ) 显然是一种错误的创建方式。

我想知道这样的例子是否可以使事情更清楚并且仍然足够简单:

std::shared_ptr<Y> Y::getObject() 
{
     return some_condition ? shared_from_this() : std::make_shared<Y>( somedata );
}

shared_from_this 的要点是让您在 没有 shared_ptr 的情况下获得 shared_ptr。这在您的示例中毫无意义,因为您的示例过于简单。想象一下,有一些函数只获得 Y*Y&,并且它需要与某人共享所有权。 Y 成员 经常发生这种情况,因为成员只能访问 this.