STD::SHARED_PTR(3)
π std::shared_ptr< _Tp > π
okay bestie, sit DOWN, because we are about to talk about std::shared_ptr< _Tp > β it's a Library Functions Manual page, it's iconic, it's the moment, and it is lowkey long, so hydrate first. π«Ά
β¨ NAME β¨
std::shared_ptr< _Tp > β a smart pointer with reference-counted copy semantics. no cap, that's the whole vibe. π
πΈ SYNOPSIS πΈ
#include <memory>
π Public Types
using element_typeβ the type pointed to by the stored pointer, akaremove_extent_t<_Tp>. yes it's a mouthful, it's giving template energy. π¦using weak_typeβ it's here, it exists, that's the tea. β
π Public Member Functions
okay this is the big list, bestie. every single one, in order, no skipping, we are thorough in this house. π
constexpr shared_ptr () noexceptβ constructs an emptyshared_ptr. the blank slate era. β¨template<typename _Yp, typename = _Constructible<_Yp*>> shared_ptr (_Yp *__p)β constructs ashared_ptrthat owns the pointer__p. π«Άtemplate<typename _Yp, typename _Deleter, typename = _Constructible<_Yp*, _Deleter>> shared_ptr (_Yp *__p, _Deleter __d)β constructs ashared_ptrthat owns the pointer__pand the deleter__d. two for one, slay. πtemplate<typename _Yp, typename _Deleter, typename _Alloc, typename = _Constructible<_Yp*, _Deleter, _Alloc>> shared_ptr (_Yp *__p, _Deleter __d, _Alloc __a)β constructs ashared_ptrthat owns the pointer__pand the deleter__d. (the allocator__ais in the signature, bestie, I just report what the page says. π)template<typename _Yp, typename = _Constructible<auto_ptr<_Yp>>> shared_ptr (auto_ptr< _Yp > &&__r)β it's there, in the list, doing its thing.shared_ptr (const shared_ptr &) noexcept=defaultβ the copy constructor. copies are literally the whole point of this class, we stan. πtemplate<typename _Yp, typename = _Constructible<const shared_ptr<_Yp>&>> shared_ptr (const shared_ptr< _Yp > &__r) noexceptβ if__ris empty, it constructs an emptyshared_ptr; otherwise it constructs ashared_ptrthat shares ownership with__r. friendship bracelet, but for memory. π«Άtemplate<typename _Yp> shared_ptr (const shared_ptr< _Yp > &__r, element_type *__p) noexceptβ constructs ashared_ptrinstance that stores__pand shares ownership with__r. two different things, don't mix them up, bestie. πtemplate<typename _Yp, typename = _Constructible<const weak_ptr<_Yp>&>> shared_ptr (const weak_ptr< _Yp > &__r)β constructs ashared_ptrthat shares ownership with__rand stores a copy of the pointer stored in__r. the weak one said "promote me" and it WORKED. π₯template<typename _Deleter> shared_ptr (nullptr_t __p, _Deleter __d)β constructs ashared_ptrthat owns a null pointer and the deleter__d. yes, you can own nothing. it's a mood. πtemplate<typename _Deleter, typename _Alloc> shared_ptr (nullptr_t __p, _Deleter __d, _Alloc __a)β constructs ashared_ptrthat owns a null pointer and the deleter__d. (allocator__aalso along for the ride. π)constexpr shared_ptr (nullptr_t) noexceptβ constructs an emptyshared_ptr. again. iconic of it. β¨shared_ptr (shared_ptr &&__r) noexceptβ move-constructs ashared_ptrinstance from__r. bye, you're mine now. πtemplate<typename _Yp, typename = _Constructible<shared_ptr<_Yp>>> shared_ptr (shared_ptr< _Yp > &&__r) noexceptβ move-constructs ashared_ptrinstance from__r. same energy, different_Yp. π¦template<typename _Yp> shared_ptr (shared_ptr< _Yp > &&__r, element_type *__p) noexceptβ constructs ashared_ptrinstance that stores__pand shares ownership with__r. (it's the aliasing thing again, she's everywhere. π)template<typename _Tp1, typename> shared_ptr (std::auto_ptr< _Tp1 > &&__r)β listed, present, accounted for. that's it, that's the note. βtemplate<typename _Yp, typename _Del, typename = _Constructible<unique_ptr<_Yp, _Del>>> shared_ptr (unique_ptr< _Yp, _Del > &&__r)β theunique_ptrone. taking over from its solo era. πelement_type * get () const noexceptβ returns the stored pointer. that's it. that's the function. π«Άoperator bool () const noexceptβ returnstrueif the stored pointer is not null. vibe check, passed. βelement_type & operator* () const noexceptβ dereference, no extra notes, we move. πelement_type * operator-> () const noexceptβ arrow, no extra notes, we move. πtemplate<typename _Yp> _Assignable< auto_ptr< _Yp > > operator= (auto_ptr< _Yp > &&__r)β assignment, listed as-is. πshared_ptr & operator= (const shared_ptr &) noexcept=defaultβ the copy assignment, defaulted, blessed. β¨template<typename _Yp> _Assignable< const shared_ptr< _Yp > & > operator= (const shared_ptr< _Yp > &__r) noexceptβ assignment from ashared_ptr< _Yp >. πΈshared_ptr & operator= (shared_ptr &&__r) noexceptβ move assignment. πtemplate<class _Yp> _Assignable< shared_ptr< _Yp > > operator= (shared_ptr< _Yp > &&__r) noexceptβ move assignment, but with a different_Yp. π₯template<typename _Yp, typename _Del> _Assignable< unique_ptr< _Yp, _Del > > operator= (unique_ptr< _Yp, _Del > &&__r)β assignment from aunique_ptr< _Yp, _Del >. πvoid reset () noexceptβ reset, no extra notes. πtemplate<typename _Yp> _SafeConv< _Yp > reset (_Yp *__p)β reset to__p. πtemplate<typename _Yp, typename _Deleter> _SafeConv< _Yp > reset (_Yp *__p, _Deleter __d)β reset with__pand deleter__d. π¦template<typename _Yp, typename _Deleter, typename _Alloc> _SafeConv< _Yp > reset (_Yp *__p, _Deleter __d, _Alloc __a)β reset with__p, deleter__dand allocator__a. the full trio. β¨void swap (__shared_ptr< _Tp, _Lp > &__other) noexceptβ exchanges both the owned pointer and the stored pointer. trade offer: I receive your pointers, you receive mine. πbool unique () const noexceptβ returnstrueifuse_count() == 1. main character energy, no roommates. πlong use_count () const noexceptβ if*thisowns a pointer, returns the number of owners; otherwise, zero. the group chat member count. πtemplate<typename _Tp1> bool owner_before (__shared_ptr< _Tp1, _Lp > const &__rhs) const noexceptβ defines an ordering based on ownership. not the pointer, the ownership. iykyk. π«Άtemplate<typename _Tp1> bool owner_before (__weak_ptr< _Tp1, _Lp > const &__rhs) const noexceptβ defines an ordering based on ownership. same deal, but with a__weak_ptr. πΈ
π¦ Friends
template<typename _Yp, typename _Alloc, typename... _Args> shared_ptr< _NonArray< _Yp > > allocate_shared (const _Alloc &, _Args &&...)template<typename _Yp, typename... _Args> shared_ptr< _NonArray< _Yp > > make_shared (_Args &&...)class weak_ptr< _Tp >
π Related Symbols
heads up bestie: these are not member symbols. they're the extended fam. π
template<typename _Del, typename _Tp> _Del * get_deleter (const shared_ptr< _Tp > &__p) noexceptβ 20.7.2.2.10 shared_ptr get_deleter.template<typename _Ch, typename _Tr, typename _Tp, _Lock_policy _Lp> std::basic_ostream< _Ch, _Tr > & operator<< (std::basic_ostream< _Ch, _Tr > &__os, const __shared_ptr< _Tp, _Lp > &__p)β writes the stored pointer to an ostream. πtemplate<typename _Tp, typename _Up> bool operator== (const shared_ptr< _Tp > &__a, const shared_ptr< _Up > &__b) noexceptβ equality operator forshared_ptrobjects; it compares the stored pointers. πtemplate<typename _Tp> bool operator== (const shared_ptr< _Tp > &__a, nullptr_t) noexceptβshared_ptrcomparison withnullptr. β¨template<typename _Tp> void swap (shared_ptr< _Tp > &__a, shared_ptr< _Tp > &__b) noexceptβ swap overload forshared_ptr. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > static_pointer_cast (const shared_ptr< _Up > &__r) noexceptβ converts the type of ashared_ptr, viastatic_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > const_pointer_cast (const shared_ptr< _Up > &__r) noexceptβ converts the type of ashared_ptr, viaconst_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > dynamic_pointer_cast (const shared_ptr< _Up > &__r) noexceptβ converts the type of ashared_ptr, viadynamic_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > reinterpret_pointer_cast (const shared_ptr< _Up > &__r) noexceptβ converts the type of ashared_ptr, viareinterpret_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > static_pointer_cast (shared_ptr< _Up > &&__r) noexceptβ converts the type of ashared_ptrrvalue, viastatic_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > const_pointer_cast (shared_ptr< _Up > &&__r) noexceptβ converts the type of ashared_ptrrvalue, viaconst_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > dynamic_pointer_cast (shared_ptr< _Up > &&__r) noexceptβ converts the type of ashared_ptrrvalue, viadynamic_cast. πtemplate<typename _Tp, typename _Up> shared_ptr< _Tp > reinterpret_pointer_cast (shared_ptr< _Up > &&__r) noexceptβ converts the type of ashared_ptrrvalue, viareinterpret_cast. πtemplate<typename _Tp, typename _Alloc, typename... _Args> shared_ptr< _NonArray< _Tp > > allocate_shared (const _Alloc &__a, _Args &&... __args)β creates an object that is owned by ashared_ptr. π«Άtemplate<typename _Tp, typename... _Args> shared_ptr< _NonArray< _Tp > > make_shared (_Args &&... __args)β creates an object that is owned by ashared_ptr. π«Ά
π Detailed Description π
template<typename _Tp>
class std::shared_ptr< _Tp >
"A smart pointer with reference-counted copy semantics."
Since: C++11 β
A shared_ptr object is either empty or it owns a pointer passed to the constructor. Copies of a shared_ptr share ownership of the same pointer. When the last shared_ptr that owns the pointer is destroyed or reset, the owned pointer is freed β either by delete or by invoking a custom deleter that was passed to the constructor. so like, the last one out turns off the lights. periodt. π
A shared_ptr also stores another pointer, which is usually (but not always) the same pointer as the one it owns. You can grab that stored pointer by calling the get() member function. sneaky? a little. intentional? absolutely. π
The equality and relational operators for shared_ptr only compare the stored pointer returned by get(), not the owned pointer. if you wanna test whether two shared_ptr objects share ownership of the same pointer, go look at std::shared_ptr::owner_before and std::owner_less. iykyk. π
π Member Typedef Documentation π
template<typename _Tp> using std::shared_ptr< _Tp >::element_type
The type pointed to by the stored pointer, remove_extent_t<_Tp>. that's the whole note, bestie, short and sweet. π
π Constructor & Destructor Documentation π
okay bestie, this is the part where we learn how to birth a shared_ptr π£β¨ there are SO many ways and honestly each one is its own little vibe. let's go one by one, no skipping, we're thorough in this house π
πΈ shared_ptr ()
template<typename _Tp> std::shared_ptr< _Tp >::shared_ptr () [inline],
[constexpr], [noexcept]
Construct an empty shared_ptr. that's it, that's the girl. she's empty and she's thriving π«Ά
Postcondition
use_count()==0 && get()==0
πΈ shared_ptr (const shared_ptr< _Tp > & )
template<typename _Tp> std::shared_ptr< _Tp >::shared_ptr (const shared_ptr<
_Tp > & ) [default], [noexcept]
Copy constructor. classic. the OG. copying one shared_ptr into another, and now they're both holding hands sharing ownership π« noexcept so she won't even stress about it.
πΈ shared_ptr (_Yp * __p)
template<typename _Tp> template<typename _Yp, typename =
_Constructible<_Yp*>> std::shared_ptr< _Tp >::shared_ptr (_Yp * __p)
[inline], [explicit]
Construct a shared_ptr that owns the pointer __p. explicit bestie, so no sneaky implicit conversions, we're keeping it intentional π
Parameters
__pβ A pointer that is convertible toelement_type*.
Postcondition
use_count() == 1 && get() == __p
Exceptions
std::bad_alloc, in which casedelete __pis called. π yeah if the allocation flops she still cleans up after herself, which is honestly more than most people do.
πΈ shared_ptr (_Yp * __p, _Deleter __d)
template<typename _Tp> template<typename _Yp, typename _Deleter, typename =
_Constructible<_Yp*, _Deleter>> std::shared_ptr< _Tp >::shared_ptr (_Yp
* __p, _Deleter __d) [inline]
Construct a shared_ptr that owns the pointer __p and the deleter __d. custom cleanup crew, we love a bespoke situation β¨
Parameters
__pβ A pointer.__dβ A deleter.
Postcondition
use_count() == 1 && get() == __p
Exceptions
std::bad_alloc, in which case__d(__p)is called.
Requirements: _Deleter's copy constructor and destructor must not throw. periodt, that's non-negotiable π«
__shared_ptr will release __p by calling __d(__p)
πΈ shared_ptr (nullptr_t __p, _Deleter __d)
template<typename _Tp> template<typename _Deleter> std::shared_ptr< _Tp
>::shared_ptr (nullptr_t __p, _Deleter __d) [inline]
Construct a shared_ptr that owns a null pointer and the deleter __d. yes she's holding nothing but she's still got opinions about how it gets cleaned up π
Parameters
__pβ A null pointer constant.__dβ A deleter.
Postcondition
use_count() == 1 && get() == __p
Exceptions
std::bad_alloc, in which case__d(__p)is called.
Requirements: _Deleter's copy constructor and destructor must not throw.
The last owner will call __d(__p)
πΈ shared_ptr (_Yp * __p, _Deleter __d, _Alloc __a)
template<typename _Tp> template<typename _Yp, typename _Deleter, typename
_Alloc, typename = _Constructible<_Yp*, _Deleter, _Alloc>>
std::shared_ptr< _Tp >::shared_ptr (_Yp * __p, _Deleter __d, _Alloc __a)
[inline]
Construct a shared_ptr that owns the pointer __p and the deleter __d β but now we're also bringing an allocator __a to the function π main character energy, three whole parameters.
Parameters
__pβ A pointer.__dβ A deleter.__aβ An allocator.
Postcondition
use_count() == 1 && get() == __p
Exceptions
std::bad_alloc, in which case__d(__p)is called.
Requirements:_Deleter's copy constructor and destructor must not throw._Alloc's copy constructor and destructor must not throw. both of them. no exceptions. (pun intended.)
__shared_ptr will release __p by calling __d(__p)
πΈ shared_ptr (nullptr_t __p, _Deleter __d, _Alloc __a)
template<typename _Tp> template<typename _Deleter, typename _Alloc>
std::shared_ptr< _Tp >::shared_ptr (nullptr_t __p, _Deleter __d, _Alloc
__a) [inline]
Construct a shared_ptr that owns a null pointer and the deleter __d β with allocator __a in the mix too. the full trio, we're eating π½οΈ
Parameters
__pβ A null pointer constant.__dβ A deleter.__aβ An allocator.
Postcondition
use_count() == 1 && get() == __p
Exceptions
std::bad_alloc, in which case__d(__p)is called.
Requirements:_Deleter's copy constructor and destructor must not throw._Alloc's copy constructor and destructor must not throw.
The last owner will call __d(__p)
πΈ the aliasing constructor (lvalue version) π
template<typename _Tp> template<typename _Yp> std::shared_ptr< _Tp
>::shared_ptr (const shared_ptr< _Yp > & __r, element_type * __p)
[inline], [noexcept]
Constructs a shared_ptr instance that stores __p and shares ownership with __r. this one is iconic, genuinely β it's how you point at a piece of something while keeping the whole thing alive π¦
Parameters
__rβ Ashared_ptr.__pβ A pointer that will remain valid while*__ris valid.
Postcondition
get() == __p && use_count() == __r.use_count()
This can be used to construct a shared_ptr to a sub-object of an object managed by an existing shared_ptr. The complete object will remain valid while any shared_ptr owns it, even if they don't store a pointer to the complete object.
shared_ptr<pair<int,int>> pii(new pair<int,int>());
shared_ptr<int> pi(pii, &pii->first);
assert(pii.use_count() == 2);
πΈ the aliasing constructor (rvalue version) π
template<typename _Tp> template<typename _Yp> std::shared_ptr< _Tp
>::shared_ptr (shared_ptr< _Yp > && __r, element_type * __p) [inline],
[noexcept]
Constructs a shared_ptr instance that stores __p and shares ownership with __r. same deal as above but she's moving in, taking the whole vibe with her π
Parameters
__rβ Ashared_ptr.__pβ A pointer that will remain valid while*__ris valid.
Postcondition
get() == __p && !__r.use_count() && !__r.get()
Since
- C++17
This can be used to construct a shared_ptr to a sub-object of an object managed by an existing shared_ptr. The complete object will remain valid while any shared_ptr owns it, even if they don't store a pointer to the complete object.
shared_ptr<pair<int,int>> pii(new pair<int,int>());
shared_ptr<int> pi1(pii, &pii->first);
assert(pii.use_count() == 2);
shared_ptr<int> pi2(std::move(pii), &pii->second);
assert(pii.use_count() == 0);
πΈ shared_ptr (const shared_ptr< _Yp > & __r) β the converting copy ctor πΈ
template<typename _Tp> template<typename _Yp, typename =
_Constructible<const shared_ptr<_Yp>&>> std::shared_ptr< _Tp
>::shared_ptr (const shared_ptr< _Yp > & __r) [inline], [noexcept]
If __r is empty, constructs an empty shared_ptr; otherwise construct a shared_ptr that shares ownership with __r. either way she matches the energy of __r, and __r is always right π
Parameters
__rβ Ashared_ptr.
Postcondition
get() == __r.get() && use_count() == __r.use_count()
πΈ shared_ptr (shared_ptr< _Tp > && __r) β the move ctor πΈ
template<typename _Tp> std::shared_ptr< _Tp >::shared_ptr (shared_ptr< _Tp >
&& __r) [inline], [noexcept]
Move-constructs a shared_ptr instance from __r. she takes what __r had and leaves __r with nothing. iconic. no notes. π₯
Parameters
__rβ Ashared_ptrrvalue.
Postcondition
*thiscontains the old value of__r,__ris empty.
πΈ shared_ptr (shared_ptr< _Yp > && __r) β the converting move ctor πΈ
template<typename _Tp> template<typename _Yp, typename =
_Constructible<shared_ptr<_Yp>>> std::shared_ptr< _Tp >::shared_ptr
(shared_ptr< _Yp > && __r) [inline], [noexcept]
Move-constructs a shared_ptr instance from __r. same girl, different _Yp, still slaying π
Parameters
__rβ Ashared_ptrrvalue.
Postcondition
*thiscontains the old value of__r,__ris empty.
πΈ shared_ptr (const weak_ptr< _Yp > & __r) πΈ
template<typename _Tp> template<typename _Yp, typename =
_Constructible<const weak_ptr<_Yp>&>> std::shared_ptr< _Tp >::shared_ptr
(const weak_ptr< _Yp > & __r) [inline], [explicit]
Constructs a shared_ptr that shares ownership with __r and stores a copy of the pointer stored in __r. she's leveling up from weak_ptr to shared_ptr and honestly? glow up π explicit, so you gotta mean it.
Parameters
__rβ Aweak_ptr.
Postcondition
use_count() == __r.use_count()
Exceptions
bad_weak_ptrwhen__r.expired(), in which case the constructor has no effect. π if the thing she was weakly vibing with is gone, she throws β and she throws before changing anything, so no mess left behind.
πΈ shared_ptr (nullptr_t ) πΈ
template<typename _Tp> std::shared_ptr< _Tp >::shared_ptr (nullptr_t )
[inline], [constexpr], [noexcept]
Construct an empty shared_ptr. from an actual nullptr_t this time. she's empty but make it constexpr β¨
Postcondition
use_count() == 0 && get() == nullptr
π Member Function Documentation π
okay these are all marked [inherited] because they come down from std::__shared_ptr< _Tp, _Lp >, the base class doing the actual heavy lifting. she's the blueprint, the shared_ptr you see is the outfit π
π¦ get ()
template<typename _Tp, _Lock_policy _Lp> element_type * std::__shared_ptr<
_Tp, _Lp >::get () const [inline], [noexcept], [inherited]
Return the stored pointer. that's it. that's the whole function. she's simple and she knows what she wants π«Ά
π¦ operator bool ()
template<typename _Tp, _Lock_policy _Lp> std::__shared_ptr< _Tp, _Lp
>::operator bool () const [inline], [explicit], [noexcept],
[inherited]
Return true if the stored pointer is not null. so you can just go if (ptr) { ... } and she'll tell you the truth π explicit so no accidental int conversions, we're not doing that today.
π¦ owner_before (__shared_ptr< _Tp1, _Lp > const & __rhs)
template<typename _Tp, _Lock_policy _Lp> template<typename _Tp1> bool
std::__shared_ptr< _Tp, _Lp >::owner_before (__shared_ptr< _Tp1, _Lp >
const & __rhs) const [inline], [noexcept], [inherited]
Define an ordering based on ownership. This function defines a strict weak ordering between two shared_ptr or weak_ptr objects, such that one object is less than the other unless they share ownership of the same pointer, or are both empty.
like, it's not comparing the pointers, bestie, it's comparing who owns what. crucial distinction, iykyk π
π¦ owner_before (__weak_ptr< _Tp1, _Lp > const & __rhs)
template<typename _Tp, _Lock_policy _Lp> template<typename _Tp1> bool
std::__shared_ptr< _Tp, _Lp >::owner_before (__weak_ptr< _Tp1, _Lp >
const & __rhs) const [inline], [noexcept], [inherited]
Define an ordering based on ownership. This function defines a strict weak ordering between two shared_ptr or weak_ptr objects, such that one object is less than the other unless they share ownership of the same pointer, or are both empty.
same vibe as the one above, except __rhs is a weak_ptr this time. still no comparison of the raw pointers. still iconic. π
π¦ swap (__shared_ptr< _Tp, _Lp > & __other)
template<typename _Tp, _Lock_policy _Lp> void std::__shared_ptr< _Tp, _Lp
>::swap (__shared_ptr< _Tp, _Lp > & __other) [inline], [noexcept],
[inherited]
Exchange both the owned pointer and the stored pointer. two things swap at once, not just one. trade szn π€
π¦ unique ()
template<typename _Tp, _Lock_policy _Lp> bool std::__shared_ptr< _Tp, _Lp
>::unique () const [inline], [noexcept], [inherited]
Return true if use_count() == 1. she's the only one. no competition. main character, literally πβ¨
π¦ use_count ()
template<typename _Tp, _Lock_policy _Lp> long std::__shared_ptr< _Tp, _Lp
>::use_count () const [inline], [noexcept], [inherited]
If *this owns a pointer, return the number of owners, otherwise zero. so she's counting the group chat members π« and if nobody owns anything, the answer is a flat 0, no cap.
π Author π
Generated automatically by Doxygen for libstdc++ from the source code. so like, not a human, a tool. still ate though π
and that's a wrap on this page bestie π this was std::shared_ptr< _Tp >(3) from libstdc++, brought to you by the Doxygen auto-generation machine β¨ go forth and share ownership responsibly, and remember: use_count() == 1 is a moment, not a lifestyle ππ¦
π¦ where this page comes from
- arch rolling: gcc 16.2.1+r23+gd564253eb6c8-1 Β· GPL-3.0-or-later WITH GCC-exception-3.1 AND GFDL-1.3-or-later
- fedora 44: libstdc++-docs 16.0.1-0.10.fc44 Β· GPL-3.0-or-later AND LGPL-3.0-or-later AND (GPL-3.0-or-later WITH GCC-exception-3.1) AND (GPL-3.0-or-later WITH Texinfo-exception) AND (LGPL-2.1-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GNU-compiler-exception) AND BSL-1.0 AND GFDL-1.3-or-later AND Linux-man-pages-copyleft-2-para AND SunPro AND BSD-1-Clause AND BSD-2-Clause AND BSD-2-Clause-Views AND BSD-3-Clause AND BSD-4-Clause AND BSD-Source-Code AND Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 WITH LLVM-Exception) AND ZPL-2.1 AND ISC AND LicenseRef-Fedora-Public-Domain AND HP-1986 AND curl AND Martin-Birgmeier AND HPND-Markus-Kuhn AND dtoa AND SMLNJ AND AMD-newlib AND OAR AND HPND-merchantability-variant AND HPND-Intel
- fedora 44: libstdc++-docs 16.2.1-2.fc44
- fedora 44: libstdc++-docs 16.2.1-3.fc44 Β· GPL-3.0-or-later AND LGPL-3.0-or-later AND (GPL-3.0-or-later WITH GCC-exception-3.1) AND (GPL-3.0-or-later WITH Texinfo-exception) AND (LGPL-2.1-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH GNU-compiler-exception) AND BSL-1.0 AND GFDL-1.3-or-later AND Linux-man-pages-copyleft-2-para AND SunPro AND BSD-1-Clause AND BSD-2-Clause AND BSD-2-Clause-Views AND BSD-3-Clause AND BSD-4-Clause AND BSD-Source-Code AND Zlib AND MIT AND Apache-2.0 AND (Apache-2.0 WITH LLVM-Exception) AND ZPL-2.1 AND ISC AND LicenseRef-Fedora-Public-Domain AND HP-1986 AND curl AND Martin-Birgmeier AND HPND-Markus-Kuhn AND dtoa AND SMLNJ AND AMD-newlib AND OAR AND HPND-merchantability-variant AND HPND-Intel
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms