C++11 标准决策"shared_ptr(const weak_ptr<Y>& r) Throws bad_weak_ptr"

C++11 standard decision "shared_ptr(const weak_ptr<Y>& r) Throws bad_weak_ptr"

本文关键字:ptr weak gt Throws bad lt const C++11 决策 shared 标准      更新时间:2023-10-16

怎么了(真正的问题在其后引用后用粗体显示)

§20.7.2.2.1

template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
23要求:Y*应可转换为T*。24效果:构造一个与r共享所有权的shared_ptr对象,并存储存储在r中的指针副本。
25后置条件:use_count() == r.use_count()
26投掷:bad_weak_ptr时为r.expired()
27异常安全:如果抛出异常,构造函数将无效

这不是助推行为。由过期的弱构造的共享给出了空的共享。你可以在布尔上下文中测试它。

为什么委员会选择了例外的方式?例如,谷歌C++准则完全排除了异常使用。有这样的指导原则,甚至在构建时禁用异常(在授权禁用的编译器上)的项目将如何处理?

最后,如果这种情况经常发生(开发人员将过期指针检测作为正常程序流),那么它的速度是否会非常慢(对于实时程序)?我记得有一篇文章提到了实现异常的两种可能策略,一种是减慢一切速度,但当异常发生时并不是真的,另一种是只有当异常发生后才减慢速度,但不会影响其他策略。我认为在某种程度上这一定仍然成立。

我忽略了整个异常,purrformance&谷歌指南咆哮,因为这太愚蠢了,除非你有一个用例可以证明这会伤害你。

如果您不想处理异常,请将其构造为

shared_ptr<T> p{r.lock()}; 

如果r.expired() == true

,这将创建一个空的shared_ptr