为什么从技术角度来看shared_from_this不能在构造函数中使用?
Why shared_from_this can't be used in constructor from technical standpoint?
在 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> {
...
};
这里有两件事我不明白:
- 这个存储自己的
shared_ptr
是谁? - 他如何在
Person
建设结束时将自己存储在任何地方?我认为Person
的构造以我编写的构造函数的最后一条语句结束。
我知道有一个weak_ptr
还没有初始化。
编辑:感谢Angew!shared_from_this
只有在创建了第一个shared_ptr
到Person
之后才能工作。这个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
对象之前。
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么虚函数不能是静态的和全局的?
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++ - 空模板类构造函数不初始化值
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 为什么继承的受保护构造函数不能公开?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 构造函数不能用于启发性化
- 有没有办法使成员函数不能从构造函数调用
- "Framework::Graphics::Material"的默认构造函数不能被引用 - 它是一个已删除的函数
- 琐碎的默认构造函数不能是 constexpr?
- 如果基类包含数组成员,则派生类的构造函数不能是constexpr
- 为什么构造函数不能在 c++ 中声明为静态?
- 构造函数不能是虚函数
- 语句调用构造函数,但对构造函数不做任何操作——为什么它不能编译
- 构造函数不能从抽象类创建对象
- c++工厂.子构造函数不能从父构造函数访问
- 为什么构造函数不能优雅地处理错误?