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

标签 c++ constructor shared-ptr

the book The C++ Standard Library在第 91 页,我读过这篇关于 shared_from_this() 的文章:

The problem is that shared_ptr stores itself in a private member of Person’s base class, enable_shared_from_this<>, at the end of the construction of the Person.



书中的相关代码片段是:
class Person : public std::enable_shared_from_this<Person> {
   ...
};

我不明白这里有两件事:
  • 这是谁shared_ptr哪个商店自己?
  • 他如何在 Person 的构建结束时将自己存储在任何地方?我认为 Person 的构造以我编写的构造函数的最后一条语句结束。

  • 我知道有weak_ptr尚未初始化。

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

    最佳答案

    原因很简单:在对象 X , enable_shared_from_this通过初始化隐藏的 weak_ptr 来工作带有第一个 shared_ptr 的拷贝指向对象 X .但是,对于 shared_ptr能够指向X , X必须已经存在(它必须已经构建)。因此,虽然 X 的构造函数正在运行,还没有shared_ptr其中enable_shared_from_this可以用。

    拿这段代码:

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

    p 的构造函数之前( shared_ptr )甚至被调用,它的参数必须被评估。该参数是表达式 new Person() .因此,Person 的构造函数在 p 的构造函数之前运行甚至已经开始——在有任何shared_ptr之前反对enable_shared_from_this可以绑定(bind)。

    关于c++ - 从技术角度来看,为什么 shared_from_this 不能在构造函数中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62881231/

    相关文章:

    c++ - Qt:文件名中的非 ASCII 字符被替换为 '?'

    c++ - 代码背后的逻辑

    c# - 为什么 new String ("Hello") 在 C# 中无效?

    c++ - 私有(private)构造函数和 make_shared

    c++ - std::move 的用法

    c++ - 在类中构建结构

    c# - 您只能使用第二类创建类对象(第一类没有构造函数?)

    c++ - 包裹在共享指针中时的 vector 构造

    c++ - 包含它的模板化类型的 shared_ptr

    c++ - 如何使用 C 风格在 C++ 中正确深度复制抽象类数组的二维数组