std::experi...ointer_cast,(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

okay so this is the std::experi...ointer_cast,(3) page from the C++ Standard Libary manual β€” yes, Libary is exactly how it’s spelled on the page, no cap. It’s the library-fundamentals-TS pointer-cast girlies, and the NAME section is literally:

std::experimental::static_pointer_cast,std::experimental::dynamic_pointer_cast,
-
std::experimental::static_pointer_cast,std::experimental::dynamic_pointer_cast,

🌸 Synopsis 🌸

Four overloads, every one of them (library fundamentals TS) and noexcept. Here they are, signature by signature:

(1) β€” (library fundamentals TS)

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

(2) β€” (library fundamentals TS)

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

(3) β€” (library fundamentals TS)

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

(4) β€” (library fundamentals TS)

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

okay so what do they actually do? They create a new instance of std::experimental::shared_ptr whose stored pointer is obtained from r’s stored pointer using a cast expression. If r is empty, so is the new shared_ptr (but its stored pointer is not necessarily null). 🫢

Otherwise, the new shared_ptr will share ownership with r, except that it is empty if the dynamic_cast performed by dynamic_pointer_cast returns a null pointer.

Let Y be typename std::experimental::shared_ptr<T>::element_type, then the resulting std::experimental::shared_ptr’s stored pointer will be obtained by calling (in respective order):

  1. static_cast<Y*>(r.get()).
  2. dynamic_cast<Y*>(r.get()) (if the result of the dynamic_cast is a null pointer value, the returned shared_ptr will be empty).
  3. const_cast<Y*>(r.get()).
  4. reinterpret_cast<Y*>(r.get()).
🚨 undefined behavior alert, bestie 🚨 The behavior of these functions is undefined unless the corresponding cast from U* to T* is well formed:
  1. The behavior is undefined unless static_cast<T*>((U*)nullptr) is well formed.
  2. The behavior is undefined unless dynamic_cast<T*>((U*)nullptr) is well formed.
  3. The behavior is undefined unless const_cast<T*>((U*)nullptr) is well formed.
  4. The behavior is undefined unless reinterpret_cast<T*>((U*)nullptr) is well formed.

πŸ’– Parameters πŸ’–

  • r β€” the pointer to convert

πŸŽ€ Example πŸŽ€

This section is incomplete. Reason: no example 😭

πŸ¦‹ See also πŸ¦‹

  • constructor β€” constructs new shared_ptr (public member function)
  • static_pointer_cast
  • dynamic_pointer_cast
  • const_pointer_cast
  • reinterpret_pointer_cast (function template) (C++17)
  • and the pointer-cast functions apply static_cast, dynamic_cast, const_cast, or reinterpret_cast to the stored pointer

🌈 Categories: 🌈

  • Noindexed pages
  • Todo no example

Source/version/date, bestie: http://cppreference.com, 2024.06.10, and the page is std::experi...ointer_cast,(3). Mwah πŸ’‹βœ¨

πŸ“¦ where this page comes from