如果您已经有一个std::shared_ptr可供使用,那么std::enable_shared_from_this有多
How useful is std::enable_shared_from_this if you already have a std::shared_ptr at your disposal?
我无意中发现了std::enable_shared_from_this,特别是在这个类似的问题上,但我仍然不明白
的意义是什么重复出现的例子如下:
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();
}
但是我不明白这个例子,如果我在这种情况下,我会直接写:
int main()
{
shared_ptr<Y> p(new Y);
shared_ptr<Y> q = p; // Results in exactly the same thing
}
感谢编辑:我认为关闭这个问题的人没有理解我的意图。这篇文章被标记为另一篇文章的副本,而这篇文章的第一行链接到相同的"另一篇文章"。我有一个问题,所谓的副本没有答案。
具体来说,实现enable_shared_from_this的类需要作为std::shared_ptr创建。你可以访问那个shared_ptr。我的问题是(在标题中请注意),"因为无论如何都被迫使用std::shared_ptr,跟踪它是否实际上使std::enable_shared_from_this无用/多余?"
我马上想到两个用例:
-
它允许对象将自己交给其他对象,然后保持共享指针。对象本身不拥有共享副本。
shared_from_this
的意义在于给对象一个内部的weak_ptr
。 -
由于传递共享指针是昂贵的(并且是多余的,当您知道它总是在调用堆栈中拥有时),因此将包含的对象作为引用传递是标准实践。如果,在调用堆栈的某个地方,你需要再次获得共享指针,你可以通过
shared_from_this
来实现。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 引用 std::shared:ptr 以避免引用计数
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- std::dynamic_pointer_cast从基到派生的std::shared返回NULL
- QSharedPointer VS std::tr1::shared_ptr VS boost::tr1::shared