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

Why shared_from_this can't be used in constructor from technical standpoint?

本文关键字:构造函数 不能 this from 技术 为什么 shared      更新时间:2023-10-16

the c++ Standard Library at page 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的构造以我编写的构造函数的最后一条语句结束。

我知道有一个weak_ptr还没有初始化。

编辑:感谢Angew!shared_from_this只有在创建了第一个shared_ptrPerson之后才能工作。这个shared_ptr将检查Person类是否继承自enable_shared_from_this,如果是,则初始化其内部weak_ptr

原因很简单:在对象X中,enable_shared_from_this通过使用指向对象X的第一个shared_ptr的副本初始化隐藏的weak_ptr来工作。然而,要使shared_ptr能够指向X, X必须已经存在(它必须已经被构造)。因此,当X的构造函数运行时,还没有enable_shared_from_this可以使用的shared_ptr

看下面这段代码:

std::shared_ptr<Person> p(new Person());

在调用p (shared_ptr)的构造函数之前,必须对其实参求值。该参数是表达式new Person()。因此,Person的构造函数甚至在p的构造函数开始之前就运行了——在enable_shared_from_this可以绑定到任何shared_ptr对象之前。