是否有一个与shared_from_this等效的weak_ptr?

Fib*_*les 6 c++ pointers shared-ptr weak-ptr c++14

我有一门课,我知道它总是由一个人拥有std::shared_ptr.但是,传递shared_ptr或甚weak_ptr至不需要所有权或生命周期保证的函数和方法会产生不必要的开销.为了解决这个问题,我经常将原始指针传递给函数.类本身继承自std::enable_shared_from_this如此,如果函数需要获取指针的所有权,它可以使用类的方法来获取shared_ptr.

这一切都很美妙.然而,在某些情况下,我真的不想shared_ptr从原始指针创建一个,我想要的是一个weak_ptr.

从我std::shared_ptr对它的通常实现的理解,它有两个原子变量用作参考计数器; 一个shared_ptr,一个weak_ptr.

如果我拥有的只是一个指向我的类的原始指针而我想要一个weak_ptr,我必须首先创建shared_ptr并转换它.这样做意味着引用计数器会像这样改变:

  • 构建shared_ptr,增加shared_ptr计数器
  • 复制构造weak_ptr,增量weak_ptr计数器
  • 允许shared_ptr超出范围,减少shared_ptr计数器

这似乎违背了"你不为你不使用的东西买单"的想法.有没有办法让我的班级在weak_ptr没有先创建的情况下提供shared_ptr

Ker*_* SB 9

在2015年10月的会议上,提案P0033被C++ 17接受,这增加weak_from_this了派生自的类std::enable_shared_from_this.


Nic*_*las 7

有没有办法让我的班级在没有首先创建shared_ptr的情况下提供weak_ptr?

不是在C++ 14中; enable_shared_from_this支持的唯一操作是创建一个shared_ptr.现在,enable_shared_from_this应该有足够的信息来weak_ptr直接构建.但是你不能从外面做,因为类没有向你公开它的实现细节.

C++ 17支持weak_ptrenable_shared_from_this类中获取a weak_from_this.

  • @curiousguy:但这不是“实施细节”;它是你的类型的*接口*的一部分,事实证明它通过继承的`shared/weak_from_this`函数*成为*接口的一部分。是的,强迫每个人在实际上不需要的时候使用工厂是愚蠢的。 (2认同)