【发布时间】:2019-08-29 18:23:07
【问题描述】:
我有使用
的成员函数(方法)std::enable_shared_from_this::weak_from_this()
简而言之:weak_from_this 将weak_ptr 返回到this。一个警告是它不能从构造函数中使用。
如果有人从继承类的构造函数中使用我的函数,则其中的weak_from_this 将返回过期的weak_ptr。我通过断言检查它没有过期来防止这种情况发生,但它是一个运行时检查。
有没有办法在编译时检查它?
【问题讨论】:
-
请注意,子类构造函数体和父类构造函数的作用域有所不同:后者在你开始初始化子类的成员(如果有的话)之前就已经完全执行了,更不用说输入了子类构造函数体。
-
好问题。一种方法是使用纯虚函数
weak_from_this创建一个虚拟类并从中继承你的。这将使它成为一个硬编译错误。 -
@SergeyA 你为什么不把它作为答案发布?这里的所有其他人似乎都认为这是不可能的,所以要么你的评论是错误的和误导性的,要么他们是错误的,你应该展示如何实现它。
-
@Bakuriu 好吧,我没有精力把它打磨成完整的答案。这可能不是一个可行的解决方案。
-
仅仅基于一个对象的静态类型不(也不能)依赖于它的构造完成的事实。请注意,如果是这种情况,您将无法在
T的 ctor 中将this存储在全局 obj 寄存器中,并在以后使用 obj,w/oa 强制转换,因为存储的 ptr 将具有“ (建设中)T*" 不普通T*.
标签: c++ constructor c++17 shared-ptr weak-ptr