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

时间:2015-08-10 16:14:14

标签: c++ constructor shared-ptr

the book The C++ Standard Library页面91,我已经阅读了有关shared_from_this()

的内容
  

问题是shared_ptr将自己存储在私有成员中   Person的基类enable_shared_from_this<>,最后的   人的建构。

本书的相关代码段为:

class Person : public std::enable_shared_from_this<Person> {
   ...
};

我不明白这里有两件事:

  1. 这个shared_ptr是谁自己存储?
  2. Person的构建结束时,他如何将自己储存在任何地方?我认为Person的构造最终是由我编写的构造函数的最后一个语句。
  3. 我知道还有weak_ptr尚未初始化。

    编辑: 感谢Angew! shared_from_this仅在创建第一个shared_ptrPerson后才有效。此shared_ptr会检查Person类是否继承自enable_shared_from_this,如果是,则初始化其内部weak_ptr

1 个答案:

答案 0 :(得分:32)

原因很简单:在对象X中,enable_shared_from_this通过使用指向对象{{1}的第一个weak_ptr的副本初始化隐藏的shared_ptr来工作。 }。但是,要使X能够指向shared_ptrX必须已经存在(必须已经构建)。因此,当X的构造函数正在运行时,X可能无法使用shared_ptr

拿这段代码:

enable_shared_from_this

std::shared_ptr<Person> p(new Person()); p)的构造函数被调用之前,必须对其参数进行求值。该论点是表达式shared_ptr。因此,new Person()的构造函数在Person的构造函数开始之前运行 - 在p可以绑定的任何shared_ptr对象之前运行。