有没有搞错 ?(此后报价后以粗体显示的真实问题)
§20.7.2.2.1
template
explicit shared_ptr(const weak_ptr & r);
23要求:Y*
应可转换为T*
.24效果:构造一个与r共享所有权的shared_ptr对象,并存储r中存储的指针的副本.
25后置条件:use_count() == r.use_count()
.
26投掷:bad_weak_ptr
何时r.expired()
.
27异常安全:如果抛出异常,则构造函数无效.
这不是助推行为.从过期的弱构造的共享给出一个空的共享.你可以在布尔上下文中测试它.
为什么委员会选择了例外的方式?例如,谷歌C++指南完全取消了异常使用.具有此类指导的项目,甚至在构建时禁用异常(在授权禁用的编译器上)将如何禁用?
最后,如果这可能经常发生(开发人员依赖过期的指针检测作为正常的程序流),那么它(对于实时程序)是不是很危险?我记得有一篇文章提到了实现异常的两种可能的策略,一种是减慢一切,但不是真的在异常发生时,另一种只有在异常发生时才会缓慢,但不会影响其余部分.我想这在某种程度上仍然必须成立.
我忽略了整个例外,性能和谷歌指南咆哮,因为这只是愚蠢的,除非你有一个用例你可以证明这会伤害你.
如果您不想处理异常,请将其构造为
shared_ptr<T> p{r.lock()};
这将创建一个空的shared_ptr
ifr.expired() == true