C++ 如果I std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的共享_ptr是否保证在内部存储null?

C++ 如果I std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的共享_ptr是否保证在内部存储null?,c++,shared-ptr,C++,Shared Ptr,为什么我对此有点困惑: std::shared_ptr可以为空,std::shared_ptr可以指向null,这两个概念并不等价 空的共享\u ptr可以存储非null值,而存储null的共享\u ptr可以具有正的ref计数 我现在想知道的是,在std::dynamic_pointer_转换之后,如何正确地测试转换是否成功?文件规定: 3-4)动态\u转换(r.get())(如果动态\u转换的结果是空指针值,则返回的共享\u ptr将为空。) 但是,由于空的共享ptr不能保证存储空值,我不

为什么我对此有点困惑:

std::shared_ptr可以为空,std::shared_ptr可以指向null,这两个概念并不等价

空的共享\u ptr可以存储非null值,而存储null的共享\u ptr可以具有正的ref计数

我现在想知道的是,在std::dynamic_pointer_转换之后,如何正确地测试转换是否成功?文件规定:

3-4)动态\u转换(r.get())(如果动态\u转换的结果是空指针值,则返回的共享\u ptr将为空。)

但是,由于空的共享ptr不能保证存储空值,我不确定动态强制转换是否成功的正确定义测试是什么,我真的不太确定,但下面是:

在中声明(23.11.2.2.9共享\u ptr强制转换)

shared_ptr dynamic_pointer_cast(const shared_ptr&r)无异常

返回:

(5.1)-当
dynamic_cast(r.get())
返回非零 值
p
shared\u ptr(r,p)

否则,
shared\u ptr()

共享\u ptr
的默认构造函数,在(20.11.3.11构造函数)中定义 作为职位条件

use\u count()==0&&get()==nullptr

我的理解是:如果原始指针转换返回
nullptr
,则智能指针转换将保存
nullptr

因此,我认为动态\u指针\u转换是成功的,如果生成的共享指针不包含空指针(成功时也可能包含空指针,但到目前为止,这在我的应用程序中并不相关)


<>但是我必须说这是我第一次进入C++标准,我也不明白,一个失败的动态CAST会如何保存一个非空的空指针,虽然我也读过了。

<代码>空共享dpTR不能保证存储一个空值< /c> >,但是如果它没有指向null,然后它应该指向一个有效的对象,然后该对象将是
dynamic\u cast
<代码>演员阵容是否成功它是
try{…}catch(std::bad_cast)
@KamilCuk dynamic_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.)