在线文档教程
C++
应用 | Utilities

std::static_pointer_cast

STD:静态[医]指针[医]CAST,STD::动态[医]指针[医]CAST,STD::Const[医]指针[医]CAST,STD::重新解释[医]指针[医]铸造

Defined in header
template< class T, class U > std::shared_ptr<T> static_pointer_cast( const std::shared_ptr<U>& r (1)(since C++11)
template< class T, class U > std::shared_ptr<T> dynamic_pointer_cast( const std::shared_ptr<U>& r (2)(since C++11)
template< class T, class U > std::shared_ptr<T> const_pointer_cast( const std::shared_ptr<U>& r (3)(since C++11)
template< class T, class U > std::shared_ptr<T> reinterpret_pointer_cast( const std::shared_ptr<U>& r (4)(since C++17)

创建一个新的实例。std::shared_ptr其存储的指针是从r%27s使用强制转换表达式存储指针。如果r是空的,新的也是空的shared_ptr%28但其存储的指针不一定为空%29。

否则,新的shared_ptr将与r,但如果dynamic_castdynamic_pointer_cast返回空指针。

让Y成typenamestd::shared_ptr<T>::element_type,然后产生的std::shared_ptr%27s存储的指针将通过按%29的顺序调用%28获得:

1%29static_cast<Y*>(r.get())...

2%29dynamic_cast<Y*>(r.get())%28如果结果为dynamic_cast为空指针值,则返回shared_ptr将为空%29。

3%29const_cast<Y*>(r.get())...

4%29reinterpret_cast<Y*>(r.get())

这些函数的行为是未定义的,除非U*T*结构良好:

1%29行为是未定义的,除非static_cast<T*>((U*)nullptr)都是很完美的。

2%29行为是未定义的,除非dynamic_cast<T*>((U*)nullptr)都是很完美的。

3%29行为是未定义的,除非const_cast<T*>((U*)nullptr)都是很完美的。

4%29行为是未定义的,除非reinterpret_cast<T*>((U*)nullptr)都是很完美的。

参数

r-The pointer to convert

例外

noexcept规格:

noexcept

注记

表达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()))可能具有相同的效果,但它们都可能导致未定义的行为,尝试删除同一对象两次%21

可能的实施

第一版

*。

模板<T类,类U>STD::Shared[医]PTR<T>静态[医]指针[医]CAST%28 Const STD::Shared[医]PTR<U>&r%29 no,{AUTO p=静态[医]CAST<TypeName STD::Shared[医]PTR<T>*要素[医]类型%2A>%28r.get%28%29%29;返回std::Shared[医]PTR<T>%28r,p%29;}

第二版

模板<T类,类U>STD::Shared[医]PTR<T>动态[医]指针[医]CAST%28 Const STD::Shared[医]PTR<U>&r%29 no,{if%28 AUTO p=Dynamic[医]CAST<TypeName STD::Shared[医]PTR<T>*要素[医]类型%2A>%28r.get%28%29%29%29{返回std::Shared[医]PTR<T>%28r,p%29;}{返回STD::Shared[医]PTR<T>%28%29;}

第三版

模板<T类,类U>STD::Shared[医]PTR<T>康斯特[医]指针[医]CAST%28 Const STD::Shared[医]PTR<U>&r%29 no,{autop=const除外[医]CAST<TypeName STD::Shared[医]PTR<T>*要素[医]类型%2A>%28r.get%28%29%29;返回std::Shared[医]PTR<T>%28r,p%29;}

二次

#include <iostream> #include <memory> struct BaseClass {}; struct DerivedClass : BaseClass { void f() const { std::cout << "Hello World!\n"; } ~DerivedClass(){ // note, it's not virtual std::cout << "~DerivedClass\n"; } }; int main() { std::shared_ptr<BaseClass> ptr_to_base(std::make_shared<DerivedClass>() // ptr_to_base->f( // Error won't compile: BaseClass has no member named 'f' std::static_pointer_cast<DerivedClass>(ptr_to_base)->f( // OK // (constructs a temporary shared_ptr, then calls operator->) static_cast<DerivedClass*>(ptr_to_base.get())->f( // also OK // (direct cast, does not construct a temporary shared_ptr) }

二次

产出:

二次

Hello World! Hello World! ~DerivedClass

二次

另见

(constructor)constructs new shared_ptr (public member function)

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/Memory/Shared[医]PTR/指针[医]铸造