在 the book The C++ Standard Library在第 91 页,我读过这篇关于 shared_from_this()
的文章:
The problem is that
shared_ptr
stores itself in a private member ofPerson
’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/