12 template <
typename... Args>
17 [[nodiscard]]
SharedPtr() noexcept : counter(
nullptr) {}
18 [[nodiscard]]
SharedPtr(std::nullptr_t) noexcept : counter(
nullptr) {}
24 requires(std::convertible_to<Y*, T*>)
28 counter->addShareCount();
34 requires(std::convertible_to<Y*, T*>)
37 other.counter =
nullptr;
42 requires(std::convertible_to<Y*, T*>)
46 counter->addShareCount();
58 requires(std::convertible_to<Y*, T*>)
63 counter->addShareCount();
71 requires(std::convertible_to<Y*, T*>)
75 other.counter =
nullptr;
82 requires(std::convertible_to<Y*, T*>)
86 counter->addShareCount();
91 [[nodiscard]] T* get()
const {
return counter ? counter->get() :
nullptr; }
93 [[nodiscard]] T* operator->()
const {
return get(); }
95 [[nodiscard]] T& operator*()
const {
return *get(); }
97 [[nodiscard]]
explicit operator bool()
const {
return get() !=
nullptr; }
99 [[nodiscard]]
int use_count()
const {
return counter ? counter->getShareCount() : 0; }