构造函数内能否使用weak_from_this()?C++技术问询
在构造函数中使用
weak_from_this()是否可行? 咱们先达成一个共识:在类的构造函数里调用shared_from_this()绝对是踩坑行为——这时候对象还没被任何shared_ptr接管,调用它要么抛出std::bad_weak_ptr异常,要么返回无效的指针,完全不符合预期。
那回到你的问题:构造函数里能不能用weak_from_this()?
根据C++标准相关说明:
这是enable_shared_from_this中私有可变weak_ptr成员的副本。
从语法层面来说,这么做是合法的,不会触发编译错误,也不会直接抛出运行时异常。但这里有个很容易被忽略的关键细节:在构造函数执行期间,enable_shared_from_this内部的那个私有weak_ptr还没有被初始化绑定到任何shared_ptr上。
当你用shared_ptr管理一个继承了enable_shared_from_this的对象时,shared_ptr的构造逻辑是在对象本身构造完成后,才会去初始化enable_shared_from_this内部的weak_ptr,把它和自身绑定。所以在构造函数里调用weak_from_this(),得到的只是一个空的weak_ptr——调用它的lock()方法只会得到nullptr,根本没法实现“获取当前对象弱引用”的目的。
最后总结一下:
- 语法上允许在构造函数中调用
weak_from_this(),不会直接报错 - 但实际逻辑上毫无意义,因为得到的是未绑定的空弱指针,完全达不到预期效果
内容的提问来源于stack exchange,提问作者Björn M.P.
相关产品推荐
相关产品推荐

