23 General utilities library [utilities]

23.11 Smart pointers [smartptr]

23.11.2 Shared-ownership pointers [util.smartptr]

23.11.2.2 Class template shared_­ptr [util.smartptr.shared]

23.11.2.2.9 shared_­ptr casts [util.smartptr.shared.cast]

template<class T, class U> shared_ptr<T> static_pointer_cast(const shared_ptr<U>& r) noexcept;

Requires: Выражение static_­cast<T*>((U*)0) должно быть правильным.

Returns:

shared_ptr<T>(r, static_cast<typename shared_ptr<T>::element_type*>(r.get()))

[ Note: Казалось бы, эквивалентное выражение в shared_­ptr<T>(static_­cast<T*>(r.get())) конечном итоге приведет к неопределенному поведению, пытаясь дважды удалить один и тот же объект. ] end note

template<class T, class U> shared_ptr<T> dynamic_pointer_cast(const shared_ptr<U>& r) noexcept;

Requires: Выражение dynamic_­cast<T*>((U*)0) должно быть правильно сформировано и иметь четко определенное поведение.

Returns:

  • Когда dynamic_­cast<typename shared_­ptr<T>​::​element_­type*>(r.get()) возвращает значение отличное от нуля p, shared_­ptr<T>(r, p).

  • В противном случае shared_­ptr<T>().

[ Note: Казалось бы, эквивалентное выражение в shared_­ptr<T>(dynamic_­cast<T*>(r.get())) конечном итоге приведет к неопределенному поведению, пытаясь дважды удалить один и тот же объект. ] end note

template<class T, class U> shared_ptr<T> const_pointer_cast(const shared_ptr<U>& r) noexcept;

Requires: Выражение const_­cast<T*>((U*)0) должно быть правильным.

Returns:

shared_ptr<T>(r, const_cast<typename shared_ptr<T>::element_type*>(r.get()))

[ Note: Казалось бы, эквивалентное выражение в shared_­ptr<T>(const_­cast<T*>(r.get())) конечном итоге приведет к неопределенному поведению, пытаясь дважды удалить один и тот же объект. ] end note

template<class T, class U> shared_ptr<T> reinterpret_pointer_cast(const shared_ptr<U>& r) noexcept;

Requires: Выражение reinterpret_­cast<T*>((U*)0) должно быть правильным.

Returns:

shared_ptr<T>(r, reinterpret_cast<typename shared_ptr<T>::element_type*>(r.get()))

[ Note: Казалось бы, эквивалентное выражение в shared_­ptr<T>(reinterpret_­cast<T*>(r.get())) конечном итоге приведет к неопределенному поведению, пытаясь дважды удалить один и тот же объект. ] end note