为什么从技术角度看 shared_from_this 不能用在构造函数中?
Why shared_from_this can't be used in constructor from technical standpoint?
在第 91 页的 the book The C++ Standard Library 中,我已阅读有关 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
尚未初始化。
编辑:
感谢 Angew! shared_from_this
仅在第一个 shared_ptr
到 Person
创建后才有效。此 shared_ptr
将检查 Person
class 是否继承自 enable_shared_from_this
,如果是则初始化其内部 weak_ptr
.
原因很简单:在对象 X
中,enable_shared_from_this
通过初始化隐藏的 weak_ptr
和指向对象 [= 的第一个 shared_ptr
的副本来工作11=]。但是,对于能够指向 X
的 shared_ptr
,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
对象之前运行。
在第 91 页的 the book The C++ Standard Library 中,我已阅读有关 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
尚未初始化。
编辑:
感谢 Angew! shared_from_this
仅在第一个 shared_ptr
到 Person
创建后才有效。此 shared_ptr
将检查 Person
class 是否继承自 enable_shared_from_this
,如果是则初始化其内部 weak_ptr
.
原因很简单:在对象 X
中,enable_shared_from_this
通过初始化隐藏的 weak_ptr
和指向对象 [= 的第一个 shared_ptr
的副本来工作11=]。但是,对于能够指向 X
的 shared_ptr
,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
对象之前运行。