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

 灬丶领袖 发布于 2023-02-12 15:37

有没有搞错 ?(此后报价后以粗体显示的真实问题)

§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++指南完全取消了异常使用.具有此类指导的项目,甚至在构建时禁用异常(在授权禁用的编译器上)将如何禁用?

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

1 个回答
  • 我忽略了整个例外,性能和谷歌指南咆哮,因为这只是愚蠢的,除非你有一个用例你可以证明这会伤害你.

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

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

    这将创建一个空的shared_ptrifr.expired() == true

    2023-02-12 15:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有