template<class T, class U>
shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r) noexcept;
[βNote: The seemingly equivalent expression shared_Βptr<T>(static_Βcast<T*>(r.get())) will eventually result in undefined behavior, attempting to delete the same object twice. βββend noteβ]
template<class T, class U>
shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept;
Requires: The expression dynamic_Βcast<T*>((U*)0) shall be well formed and shall have well defined behavior.
[βNote: The seemingly equivalent expression shared_Βptr<T>(dynamic_Βcast<T*>(r.get())) will eventually result in undefined behavior, attempting to delete the same object twice. βββend noteβ]
template<class T, class U>
shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r) noexcept;
[βNote: The seemingly equivalent expression shared_Βptr<T>(const_Βcast<T*>(r.get())) will eventually result in undefined behavior, attempting to delete the same object twice. βββend noteβ]
template<class T, class U>
shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept;