c++ - 如果我 std::dynamic_pointer_cast 并且底层 dynamic_cast 的结果为 null,则返回的 shared_ptr 是否保证将 null 存储在里面?
问题描述
为什么我对此有点困惑:
std::shared_ptr 可以为空,std::shared_ptr 可以指向 null,这两个概念不等价。
一个空的 shared_ptr 可以存储一个非 null 值,一个存储 null 的 shared_ptr 可以有一个正的引用计数。
我现在想知道的是如何在 std::dynamic_pointer_cast 之后正确测试转换是否成功?文档https://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast状态:
3-4) dynamic_cast<Y*>(r.get()) (If the result of the dynamic_cast is a null pointer value, the returned shared_ptr will be empty.)
但由于不能保证一个空的shared_ptr 存储一个空值,我不确定动态转换是否成功的正确定义测试是什么
解决方案
我真的不太确定,但这里有:
c++17 和 c++20 标准草案在 (23.11.2.2.9 shared_ptr casts) 中声明
shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept;
回报:
(5.1) — 当dynamic_cast<typename shared_ptr<T>::element_type*>(r.get())
返回一个非零值p
时,shared_ptr<T>(r, p)
否则,shared_ptr<T>()
。
shared_ptr<T>
在 (20.11.3.11 Constructors) 中定义的默认构造函数具有作为后置条件
use_count() == 0 && get() == nullptr
我将其读为:如果原始指针强制转换返回nullptr
,智能指针强制转换将持有nullptr
.
因此,我认为 dynamic_pointer_cast 是成功的,如果生成的共享指针不包含空指针(成功时它也可能包含空指针,但到目前为止,这与我的应用程序无关)。
但我必须说这是我第一次尝试 C++ 标准,我也不明白,一个失败的动态转换怎么可能持有一个非空的空指针,尽管我也读过。
推荐阅读
- python - 让 Python 程序运行另一个 Python 程序并让它们同时运行?
- javascript - Electron 桌面应用程序在它应该是离线应用程序时尝试 TCP 连接
- java - 如何断言对象列表具有一组具有特定值的属性
- c# - 使用 EPPlus 将 Web 表单 DataGrid 导出到 excel
- javascript - HowlerJS 步进函数不会在搜索时更新范围输入值
- java - SOAP 错误无法解组
- c# - 如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的`applicationUrl` 属性?
- reactjs - DevOps 找不到 APPSETTINGS.JSON 文件 - 但项目按预期部署和运行
- reactjs - 用类似的对象更新反应状态
- python - 来自命令行的用户输入