是否有 weak_ptr 等同于 shared_from_this?

Is there a weak_ptr equivalent to shared_from_this?

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

一切都很顺利。但是有些情况下我真的不想从原始指针创建 shared_ptr,我想要的是 weak_ptr.

根据我对 std::shared_ptr 通常实现的理解,它有两个用作引用计数器的原子变量;一份用于 shared_ptr,一份用于 weak_ptr.

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

这似乎与 "you don't pay for what you don't use" 的想法相悖。有没有办法让我的 class 只提供 weak_ptr 而无需先创建 shared_ptr

实现起来几乎是微不足道的,不值得放入库中...

#include <memory>

template<class T> std::weak_ptr<T> weak_from_this(T*p) {
  return { p->shared_from_this() };
}

struct S : std::enable_shared_from_this<S>
{
  auto foo() {
    return weak_from_this(this);
  }
};


int main()
{
  auto ps = std::make_shared<S>();
  auto wps = ps->foo();
}

Is there a way for my class to just provide weak_ptr without first creating a shared_ptr?

不在 C++14 中; enable_shared_from_this 支持的唯一操作是创建 shared_ptr。现在,enable_shared_from_this应该有足够的信息来直接构造一个weak_ptr。但是您不能从外部执行此操作,因为 class 不会向您公开其实现细节。

C++17 支持通过 weak_from_this.

enable_shared_from_this class 获取 weak_ptr

提案 P0033 was accepted for C++17 in the October 2015 meeting, which adds weak_from_this 至 类 来自 std::enable_shared_from_this