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_cast
由dynamic_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/指针[医]铸造