- memory[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp11[meta cpp]
namespace std {
template<class T, class U>
shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r) noexcept; // (1) C++11
template <class T, class U>
shared_ptr<T> static_pointer_cast(shared_ptr<U>&& r) noexcept; // (2) C++20
}
shared_ptr
で管理するインスタンスに対して static_cast
を行う。
-
r
が空であった場合、この関数は空のshared_ptr<T>
を返却する。 -
(1) :
return shared_ptr<T>(r, static_cast<typename shared_ptr<T>::element_type*>(r.get()));
- r.get()[link get.md]
-
(2) :
return shared_ptr<T>(std::move(r), static_cast<typename shared_ptr<T>::element_type*>(r.get()));
- std::move[link /reference/utility/move.md]
- r.get()[link get.md]
shared_ptr<T>(static_cast<T*>(r.get()))
という方法は未定義動作を引き起こすので使用しないこと。
#include <memory>
#include <iostream>
struct A {
virtual void call() const {
std::cout << "A::call" << std::endl;
}
};
struct B : A {
void call() const {
std::cout << "B::call()" << std::endl;
}
};
int main() {
auto sp1 = std::make_shared<B>();
sp1->call();
auto sp2 = std::static_pointer_cast<A>(sp1);
if(sp1 == sp2) {
sp2->call();
}
}
- std::static_pointer_cast[color ff0000]
- std::make_shared[link /reference/memory/make_shared.md]
B::call()
B::call()
- C++11
- Clang: ??
- GCC: 4.4 [mark verified]
- ICC: ??
- Visual C++: 2008 (TR1) [mark verified], 2010 [mark verified], 2012 [mark verified], 2013 [mark verified]