0

有没有搞错 ?(后面引用的真实问题以粗体表示)

§ 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_ptrr.expired().
27 异常安全:如果抛出异常,构造函数没有任何作用。

这不是提升行为。由过期的弱构造的共享提供了一个空的共享。您可以在布尔上下文中对其进行测试。

为什么委员会选择了例外的方式?例如,谷歌 C++ 指南完全禁止使用异常。具有此类准则的项目,甚至在构建时禁用异常(在授权禁用的编译器上)将如何做?

最后,如果这可能经常发生(开发人员依赖过期指针检测作为正常程序流程),它会不会很慢(对于实时程序)?我记得一篇文章提到了实现异常的两种可能的策略,一种是在异常发生时减慢一切,但不是真的,另一种仅在发生异常时才变慢,但不会影响其余部分。我这在某种程度上仍然是正确的。

4

1 回答 1

8

我忽略了整个例外、性能和谷歌指南的咆哮,因为这很愚蠢,除非你有一个用例可以证明这会伤害你。

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

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

shared_ptr如果_r.expired() == true

于 2013-12-06T02:01:15.277 回答