有没有搞错 ?(后面引用的真实问题以粗体表示)
§ 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++ 指南完全禁止使用异常。具有此类准则的项目,甚至在构建时禁用异常(在授权禁用的编译器上)将如何做?
最后,如果这可能经常发生(开发人员依赖过期指针检测作为正常程序流程),它会不会很慢(对于实时程序)?我记得一篇文章提到了实现异常的两种可能的策略,一种是在异常发生时减慢一切,但不是真的,另一种仅在发生异常时才变慢,但不会影响其余部分。我想这在某种程度上仍然是正确的。