Instances of std::experimental::weak_ptr hold non-owning
pointers to objects owned by one or more std::experimental::shared_ptr instances. A std::experimental::weak_ptr
cannot be dereferenced directly, but must be converted to a std::experimental::shared_ptr instance beforehand,
which will then share ownership of the pointer with the other std::experimental::shared_ptr instances.
When the last std::experimental::shared_ptr object that owns a
pointer referenced by a std::experimental::weak_ptr instance is destroyed
or reassigned, that std::experimental::weak_ptr instance is expired, and attempts to convert that std::experimental::weak_ptr instance to a std::experimental::shared_ptr will fail.
The std::experimental::weak_ptr class template is an implementation
of std::weak_ptr that integrates with std::experimental::atomic_weak_ptr. It is a complete
drop-in replacement: you can just switch everywhere that uses std::weak_ptr to use std::experimental::weak_ptr
instead, and everything should work as before.
The reason for the new implementation is that the core reference counting
data structure needs to be modified to accommodate the additional requirements
of std::experimental::atomic_weak_ptr, which are not
supported by std::weak_ptr.
To handle the cases where it is not acceptable to replace all uses of
std::weak_ptr throughout a codebase, instances
of std::experimental::weak_ptr<T>
can be converted from std::weak_ptr<T> and std::tr1::weak_ptr<T> if either is available from the native
library on a given platform. This will require allocating an additional
data structure if the store pointer was not first owned by a std::experimental::shared_ptr instance.
template<typename T> class weak_ptr { public: constexpr weak_ptr() noexcept; weak_ptr(weak_ptr const& other) noexcept; weak_ptr(weak_ptr&& other) noexcept; template<class Other> weak_ptr(weak_ptr<Other> const& other) noexcept; template<class Other> weak_ptr(weak_ptr<Other>&& other) noexcept; template<class Other> weak_ptr(shared_ptr<Other> const& other) noexcept; weak_ptr(std::weak_ptr<T> other); weak_ptr(std::tr1::weak_ptr<T> other); ~weak_ptr(); weak_ptr& operator=(weak_ptr const& other) noexcept; weak_ptr& operator=(weak_ptr&& other) noexcept; template<typename Other> weak_ptr& operator=(weak_ptr<Other> const& other) noexcept; template<typename Other> weak_ptr& operator=(weak_ptr<Other>&& other) noexcept; void swap(weak_ptr& other) noexcept; void reset() noexcept; long use_count() const noexcept; bool expired() const noexcept; shared_ptr<T> lock() const noexcept; template<typename Other> bool owner_before(shared_ptr<Other> const&) const noexcept; template<typename Other> bool owner_before(weak_ptr<Other> const&) const noexcept; };
#include <experimental/atomic>