C++基类和派生类的智能指针转换:static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_cast 当我们用“裸”指针进行类层次上的上下行转换时,可以使用dynamic_cast。当然我们也可以使用static_cast,只是dynamic_cast在进行下行转换的时候(即基类到派生类)具有类型检查功能,而static_cast没有。
std::static_pointer_cast 是C++11 引入的一个模板函数,用于智能指针(如 std::shared_ptr 或std::weak_ptr)之间的类型转换。这种转换是编译时的强制转换,不会在运行时进行检查,类似于 static_cast,但专门用于智能指针,确保转换后的指针仍然保留智能指针的内存管理功能(如引用计数和自动内存释放)。
static_pointer_cast从表面上看就是静态指针类型转换。细细看来,并不是那么简单,有一个隐形的限制条件。首先这个是c++11里的,更老的编译器可能不支持,其次指针是shared_ptr类型的,对于普通指针是无效的。还有一般只用在子类父类的继承关系中,当子类中要获取父类中的一些属性时(当然了子类通过多态拥有自己的父类继...
它的源码实现涉及到类型系统和编译器的底层细节,下面是对其源码解析的概述。 首先,我们需要了解static_pointer_cast的语法和语义。它的语法形式如下: ```cpp static_pointer_cast<T>(p); ``` 其中,T是目标类型,p是待转换的指针或引用。static_pointer_cast的语义是执行一次类型转换,将p转换为T类型的指针或引用...
template <class Ty, class Other> shared_ptr<Ty> static_pointer_cast(const shared_ptr<Other>& sp); 參數Ty 傳回的共用指標控制項型別。 Other 引數會控制的型別共用指標。 Other 引數具有共用指標。備註樣板函式傳回空白 shared_ptr 物件 sp 是否為空白的 shared_ptr 物件;否則會傳回擁有資源由 sp所...
std::shared_ptr<T> static_pointer_cast( const std::shared_ptr<U>& r ) noexcept; (1) (C++11 起) template< class T, class U >std::shared_ptr<T> static_pointer_cast( std::shared_ptr<U>&& r ) noexcept; (2) (C++20 起) template< class T, class U >std::shared_ptr<T> ...
七十八、static_cast和dynamic_cast,static_poonter_cast和dynamic_pointer_cast区别,一、static_cast和dynamic_cast区别:1、static_cast:向上转换,例如:基类向派生类转换2、dynamic_cast:向下转换,例如
return (mk_tcp_session_ref)new std::shared_ptr<SessionForC>(std::dynamic_pointer_cast<SessionForC>(ref)); return (mk_tcp_session_ref)new std::shared_ptr<SessionForC>(std::static_pointer_cast<SessionForC>(ref)); }API_EXPORT void mk_tcp_session_ref_release(const mk_tcp_session_ref ...
表达式std::shared_ptr<T>(static_cast<T*>(r.get()))、std::shared_ptr<T>(dynamic_cast<T*>(r.get()))及std::shared_ptr<T>(const_cast<T*>(r.get()))看起来可能拥有相同效果,但它们全都很可能导致未定义行为,试图二次删除同一对象!
我了解将 static_pointer_cast 与 unique_ptr 一起使用会导致所包含数据的共享所有权。 换句话说,我想做的是: {代码...} 无论如何,这样做会导致两个 unique_ptr 永远不应该同时存在,所以它只是被禁止的。 是...