为什么shared_from_this从技术角度来看不能在构造函数中使用?

Yol*_*ola 31 c++ constructor shared-ptr

在第91页的"C++标准库 "一书中,我读过以下内容shared_from_this():

问题是,shared_ptr卖场本身的私有成员 Person的基类enable_shared_from_this<>,在最后的人的建设.

该书的相关代码片段是:

class Person : public std::enable_shared_from_this<Person> {
   ...
};
Run Code Online (Sandbox Code Playgroud)

我不明白这里有两件事:

  1. 这是谁shared_ptr存储自己?
  2. 如何在建筑结束时将自己存放在任何地方Person?我认为构造Person最终是由我编写的构造函数的最后一个语句.

我知道还有weak_ptr尚未初始化的内容.

编辑:感谢Angew!shared_from_this将工作后,才第一次shared_ptrPerson创建.这shared_ptr将检查Person类是否继承enable_shared_from_this,如果是,则初始化其内部weak_ptr.

Rei*_*ica 42

原因很简单:在对象中X,enable_shared_from_this通过初始化隐藏weak_ptr的第shared_ptr一个指向对象的副本来工作X.但是,对于一个shared_ptr能够指向X,X必须已经存在(它必须已经构建).因此,构造,同时X运行时,尚无shared_ptrenable_shared_from_this可以使用.

拿这段代码:

std::shared_ptr<Person> p(new Person());
Run Code Online (Sandbox Code Playgroud)

p(shared_ptr甚至)的构造函数被调用之前,必须对其参数进行求值.那个论点就是表达new Person().因此,构造函数Person之前的运行构造函数p甚至已经开始 - 在有任何可以绑定的shared_ptr对象之前enable_shared_from_this.

  • 谢谢@霍尔特。看起来好像是shared_ptr的构造函数负责初始化weak_ptr。只有那些采用原始指针(例如,从对new的调用返回的指针)的构造函数才能进行初始化。复制构造函数没有。由于只有一个原始的`shared_ptr`到`X`应该由一个原始指针构造(其他通常是复制构造的),所以`weak_ptr`由第一个`shared_ptr`到`X初始化。 (2认同)