首页 > 解决方案 > 如果我 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++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++ 标准,我也不明白,一个失败的动态转换怎么可能持有一个非空的空指针,尽管我也读过。


推荐阅读