More asciidoctor changes

Reinstate the none/blank trick, but remove the blank line after it in local_shared_ptr.adoc that causes the problem. Also use that trick in place of the nested DLs which don't work with Asciidoctor 2
This commit is contained in:
Glen Fernandes
2019-03-24 23:41:04 -04:00
parent adcab0e313
commit d10299159a
9 changed files with 528 additions and 179 deletions

View File

@ -136,14 +136,18 @@ Provides the type of the template parameter T.
intrusive_ptr() noexcept; intrusive_ptr() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Postconditions:: `get() == 0`. Postconditions:: `get() == 0`.
``` ```
intrusive_ptr(T * p, bool add_ref = true); intrusive_ptr(T * p, bool add_ref = true);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `if(p != 0 && add_ref) intrusive_ptr_add_ref(p);`. Effects:: `if(p != 0 && add_ref) intrusive_ptr_add_ref(p);`.
Postconditions:: `get() == p`. Postconditions:: `get() == p`.
@ -154,7 +158,9 @@ intrusive_ptr(intrusive_ptr const & r);
template<class Y> intrusive_ptr(intrusive_ptr<Y> const & r); template<class Y> intrusive_ptr(intrusive_ptr<Y> const & r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `T * p = r.get(); if(p != 0) intrusive_ptr_add_ref(p);`. Effects:: `T * p = r.get(); if(p != 0) intrusive_ptr_add_ref(p);`.
Postconditions:: `get() == r.get()`. Postconditions:: `get() == r.get()`.
@ -165,7 +171,9 @@ intrusive_ptr(intrusive_ptr && r);
template<class Y> intrusive_ptr(intrusive_ptr<Y> && r); template<class Y> intrusive_ptr(intrusive_ptr<Y> && r);
``` ```
[horizontal] [none]
* {blank}
+
Postconditions:: `get()` equals the old value of `r.get()`. `r.get() == 0`. Postconditions:: `get()` equals the old value of `r.get()`. `r.get() == 0`.
### destructor ### destructor
@ -174,7 +182,9 @@ Postconditions:: `get()` equals the old value of `r.get()`. `r.get() == 0`.
~intrusive_ptr(); ~intrusive_ptr();
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `if(get() != 0) intrusive_ptr_release(get());`. Effects:: `if(get() != 0) intrusive_ptr_release(get());`.
### assignment ### assignment
@ -189,7 +199,9 @@ template<class Y> intrusive_ptr & operator=(intrusive_ptr<Y> const & r);
intrusive_ptr & operator=(T * r); intrusive_ptr & operator=(T * r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `intrusive_ptr(r).swap(*this)`. Effects:: Equivalent to `intrusive_ptr(r).swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
@ -200,7 +212,9 @@ intrusive_ptr & operator=(intrusive_ptr && r);
template<class Y> intrusive_ptr & operator=(intrusive_ptr<Y> && r); template<class Y> intrusive_ptr & operator=(intrusive_ptr<Y> && r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `intrusive_ptr(std::move(r)).swap(*this)`. Effects:: Equivalent to `intrusive_ptr(std::move(r)).swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
@ -210,21 +224,27 @@ Returns:: `*this`.
void reset(); void reset();
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `intrusive_ptr().swap(*this)`. Effects:: Equivalent to `intrusive_ptr().swap(*this)`.
``` ```
void reset(T * r); void reset(T * r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `intrusive_ptr(r).swap(*this)`. Effects:: Equivalent to `intrusive_ptr(r).swap(*this)`.
``` ```
void reset(T * r, bool add_ref); void reset(T * r, bool add_ref);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `intrusive_ptr(r, add_ref).swap(*this)`. Effects:: Equivalent to `intrusive_ptr(r, add_ref).swap(*this)`.
### indirection ### indirection
@ -233,7 +253,9 @@ Effects:: Equivalent to `intrusive_ptr(r, add_ref).swap(*this)`.
T & operator*() const noexcept; T & operator*() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requirements:: `get() != 0`. Requirements:: `get() != 0`.
Returns:: `*get()`. Returns:: `*get()`.
@ -241,7 +263,9 @@ Returns:: `*get()`.
T * operator->() const noexcept; T * operator->() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requirements:: `get() != 0`. Requirements:: `get() != 0`.
Returns:: `get()`. Returns:: `get()`.
@ -251,7 +275,9 @@ Returns:: `get()`.
T * get() const noexcept; T * get() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: the stored pointer. Returns:: the stored pointer.
### detach ### detach
@ -260,7 +286,9 @@ Returns:: the stored pointer.
T * detach() noexcept; T * detach() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: the stored pointer. Returns:: the stored pointer.
Postconditions:: `get() == 0`. Postconditions:: `get() == 0`.
@ -278,7 +306,9 @@ the implications are thoroughly understood.
explicit operator bool () const noexcept; explicit operator bool () const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `get() != 0`. Returns:: `get() != 0`.
NOTE: This conversion operator allows `intrusive_ptr` objects to be used in boolean contexts, NOTE: This conversion operator allows `intrusive_ptr` objects to be used in boolean contexts,
@ -292,7 +322,9 @@ NOTE: On C++03 compilers, the return value is of an unspecified type.
void swap(intrusive_ptr & b) noexcept; void swap(intrusive_ptr & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Exchanges the contents of the two smart pointers. Effects:: Exchanges the contents of the two smart pointers.
## Free Functions ## Free Functions
@ -304,7 +336,9 @@ template<class T, class U>
bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) noexcept; bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() == b.get()`. Returns:: `a.get() == b.get()`.
``` ```
@ -312,7 +346,9 @@ template<class T, class U>
bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) noexcept; bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() != b.get()`. Returns:: `a.get() != b.get()`.
``` ```
@ -320,7 +356,9 @@ template<class T, class U>
bool operator==(intrusive_ptr<T> const & a, U * b) noexcept; bool operator==(intrusive_ptr<T> const & a, U * b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() == b`. Returns:: `a.get() == b`.
``` ```
@ -328,7 +366,9 @@ template<class T, class U>
bool operator!=(intrusive_ptr<T> const & a, U * b) noexcept; bool operator!=(intrusive_ptr<T> const & a, U * b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() != b`. Returns:: `a.get() != b`.
``` ```
@ -336,7 +376,9 @@ template<class T, class U>
bool operator==(T * a, intrusive_ptr<U> const & b) noexcept; bool operator==(T * a, intrusive_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a == b.get()`. Returns:: `a == b.get()`.
``` ```
@ -344,7 +386,9 @@ template<class T, class U>
bool operator!=(T * a, intrusive_ptr<U> const & b) noexcept; bool operator!=(T * a, intrusive_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a != b.get()`. Returns:: `a != b.get()`.
``` ```
@ -352,7 +396,9 @@ template<class T>
bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b) noexcept; bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `std::less<T *>()(a.get(), b.get())`. Returns:: `std::less<T *>()(a.get(), b.get())`.
NOTE: Allows `intrusive_ptr` objects to be used as keys in associative containers. NOTE: Allows `intrusive_ptr` objects to be used as keys in associative containers.
@ -363,7 +409,9 @@ NOTE: Allows `intrusive_ptr` objects to be used as keys in associative container
template<class T> void swap(intrusive_ptr<T> & a, intrusive_ptr<T> & b) noexcept; template<class T> void swap(intrusive_ptr<T> & a, intrusive_ptr<T> & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `a.swap(b)`. Effects:: Equivalent to `a.swap(b)`.
### get_pointer ### get_pointer
@ -372,7 +420,9 @@ Effects:: Equivalent to `a.swap(b)`.
template<class T> T * get_pointer(intrusive_ptr<T> const & p) noexcept; template<class T> T * get_pointer(intrusive_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get()`. Returns:: `p.get()`.
NOTE: Provided as an aid to generic programming. Used by `mem_fn`. NOTE: Provided as an aid to generic programming. Used by `mem_fn`.
@ -384,7 +434,9 @@ template<class T, class U>
intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & r) noexcept; intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `intrusive_ptr<T>(static_cast<T*>(r.get()))`. Returns:: `intrusive_ptr<T>(static_cast<T*>(r.get()))`.
### const_pointer_cast ### const_pointer_cast
@ -394,7 +446,9 @@ template<class T, class U>
intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & r) noexcept; intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `intrusive_ptr<T>(const_cast<T*>(r.get()))`. Returns:: `intrusive_ptr<T>(const_cast<T*>(r.get()))`.
### dynamic_pointer_cast ### dynamic_pointer_cast
@ -404,7 +458,9 @@ template<class T, class U>
intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & r) noexcept; intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `intrusive_ptr<T>(dynamic_cast<T*>(r.get()))`. Returns:: `intrusive_ptr<T>(dynamic_cast<T*>(r.get()))`.
### operator<< ### operator<<
@ -415,6 +471,8 @@ template<class E, class T, class Y>
intrusive_ptr<Y> const & p); intrusive_ptr<Y> const & p);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `os << p.get();`. Effects:: `os << p.get();`.
Returns:: `os`. Returns:: `os`.

View File

@ -81,7 +81,9 @@ intrusive_ref_counter() noexcept;
``` ```
intrusive_ref_counter(const intrusive_ref_counter&) noexcept; intrusive_ref_counter(const intrusive_ref_counter&) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Postconditions:: `use_count() == 0`. Postconditions:: `use_count() == 0`.
NOTE: The pointer to the constructed object is expected to be passed to NOTE: The pointer to the constructed object is expected to be passed to
@ -93,7 +95,9 @@ would increment the reference counter.
``` ```
~intrusive_ref_counter(); ~intrusive_ref_counter();
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Destroys the counter object. Effects:: Destroys the counter object.
NOTE: The destructor is protected so that the object can only be destroyed NOTE: The destructor is protected so that the object can only be destroyed
@ -104,7 +108,9 @@ through the `Derived` class.
``` ```
intrusive_ref_counter& operator=(const intrusive_ref_counter& v) noexcept; intrusive_ref_counter& operator=(const intrusive_ref_counter& v) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Does nothing, reference counter is not modified. Effects:: Does nothing, reference counter is not modified.
### use_count ### use_count
@ -112,7 +118,9 @@ Effects:: Does nothing, reference counter is not modified.
``` ```
unsigned int use_count() const noexcept; unsigned int use_count() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The current value of the reference counter. Returns:: The current value of the reference counter.
NOTE: The returned value may not be actual in multi-threaded applications. NOTE: The returned value may not be actual in multi-threaded applications.
@ -126,7 +134,9 @@ template<class Derived, class CounterPolicy>
void intrusive_ptr_add_ref( void intrusive_ptr_add_ref(
const intrusive_ref_counter<Derived, CounterPolicy>* p) noexcept; const intrusive_ref_counter<Derived, CounterPolicy>* p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Increments the reference counter. Effects:: Increments the reference counter.
### intrusive_ptr_release ### intrusive_ptr_release
@ -136,6 +146,8 @@ template<class Derived, class CounterPolicy>
void intrusive_ptr_release( void intrusive_ptr_release(
const intrusive_ref_counter<Derived, CounterPolicy>* p) noexcept; const intrusive_ref_counter<Derived, CounterPolicy>* p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Decrements the reference counter. If the reference counter reaches Effects:: Decrements the reference counter. If the reference counter reaches
0, calls `delete static_cast<const Derived*>(p)`. 0, calls `delete static_cast<const Derived*>(p)`.

View File

@ -227,7 +227,9 @@ constexpr local_shared_ptr() noexcept;
``` ```
constexpr local_shared_ptr(std::nullptr_t) noexcept; constexpr local_shared_ptr(std::nullptr_t) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs an empty `local_shared_ptr`. Effects:: Constructs an empty `local_shared_ptr`.
Postconditions:: `local_use_count() == 0 && get() == 0`. Postconditions:: `local_use_count() == 0 && get() == 0`.
@ -235,7 +237,9 @@ Postconditions:: `local_use_count() == 0 && get() == 0`.
``` ```
template<class Y> explicit local_shared_ptr(Y * p); template<class Y> explicit local_shared_ptr(Y * p);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `local_shared_ptr` that owns `shared_ptr<T>( p )`. Effects:: Constructs a `local_shared_ptr` that owns `shared_ptr<T>( p )`.
Postconditions:: `local_use_count() == 1 && get() == p`. Postconditions:: `local_use_count() == 1 && get() == p`.
@ -249,7 +253,9 @@ template<class Y, class D> local_shared_ptr(Y * p, D d);
``` ```
template<class D> local_shared_ptr(std::nullptr_t p, D d); template<class D> local_shared_ptr(std::nullptr_t p, D d);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `local_shared_ptr` that owns `shared_ptr<T>( p, d )`. Effects:: Constructs a `local_shared_ptr` that owns `shared_ptr<T>( p, d )`.
Postconditions:: `local_use_count() == 1 && get() == p`. Postconditions:: `local_use_count() == 1 && get() == p`.
@ -262,7 +268,9 @@ template<class Y, class D, class A> local_shared_ptr(Y * p, D d, A a);
``` ```
template<class D, class A> local_shared_ptr(std::nullptr_t p, D d, A a); template<class D, class A> local_shared_ptr(std::nullptr_t p, D d, A a);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `local_shared_ptr` that owns `shared_ptr<T>( p, d, a )`. Effects:: Constructs a `local_shared_ptr` that owns `shared_ptr<T>( p, d, a )`.
Postconditions:: `local_use_count() == 1 && get() == p`. Postconditions:: `local_use_count() == 1 && get() == p`.
@ -276,7 +284,9 @@ local_shared_ptr(local_shared_ptr const & r) noexcept;
``` ```
template<class Y> local_shared_ptr(local_shared_ptr<Y> const & r) noexcept; template<class Y> local_shared_ptr(local_shared_ptr<Y> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: If `r` is empty, constructs an empty `local_shared_ptr`; otherwise, constructs a `local_shared_ptr` that shares ownership with `r`. Effects:: If `r` is empty, constructs an empty `local_shared_ptr`; otherwise, constructs a `local_shared_ptr` that shares ownership with `r`.
@ -290,7 +300,9 @@ local_shared_ptr(local_shared_ptr && r) noexcept;
``` ```
template<class Y> local_shared_ptr(local_shared_ptr<Y> && r) noexcept; template<class Y> local_shared_ptr(local_shared_ptr<Y> && r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: Move-constructs a `local_shared_ptr` from `r`. Effects:: Move-constructs a `local_shared_ptr` from `r`.
@ -304,7 +316,9 @@ template<class Y> local_shared_ptr( shared_ptr<Y> const & r );
``` ```
template<class Y> local_shared_ptr( shared_ptr<Y> && r ); template<class Y> local_shared_ptr( shared_ptr<Y> && r );
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `local_shared_ptr` that owns `r`. Effects:: Constructs a `local_shared_ptr` that owns `r`.
Postconditions:: `local_use_count() == 1`. `get()` returns the old value of `r.get()`. Postconditions:: `local_use_count() == 1`. `get()` returns the old value of `r.get()`.
@ -315,7 +329,9 @@ Throws:: `std::bad_alloc`, or an implementation-defined exception when a resourc
``` ```
template<class Y> local_shared_ptr(local_shared_ptr<Y> const & r, element_type * p) noexcept; template<class Y> local_shared_ptr(local_shared_ptr<Y> const & r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: constructs a `local_shared_ptr` that shares ownership with `r` and stores `p`. Effects:: constructs a `local_shared_ptr` that shares ownership with `r` and stores `p`.
Postconditions:: `get() == p && local_use_count() == r.local_use_count()`. Postconditions:: `get() == p && local_use_count() == r.local_use_count()`.
@ -324,7 +340,9 @@ Postconditions:: `get() == p && local_use_count() == r.local_use_count()`.
``` ```
template<class Y> local_shared_ptr(local_shared_ptr<Y> && r, element_type * p) noexcept; template<class Y> local_shared_ptr(local_shared_ptr<Y> && r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Move-constructs a `local_shared_ptr` from `r`, while storing `p` instead. Effects:: Move-constructs a `local_shared_ptr` from `r`, while storing `p` instead.
Postconditions:: `get() == p` and `local_use_count()` equals the old count of `r`. `r` is empty and `r.get() == 0`. Postconditions:: `get() == p` and `local_use_count()` equals the old count of `r`. `r` is empty and `r.get() == 0`.
@ -333,7 +351,9 @@ Postconditions:: `get() == p` and `local_use_count()` equals the old count of `r
``` ```
template<class Y, class D> local_shared_ptr(std::unique_ptr<Y, D> && r); template<class Y, class D> local_shared_ptr(std::unique_ptr<Y, D> && r);
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: Effects::
@ -348,7 +368,9 @@ Exception safety:: If an exception is thrown, the constructor has no effect.
``` ```
~local_shared_ptr() noexcept; ~local_shared_ptr() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Effects::
- If `*this` is empty, or shares ownership with another `local_shared_ptr` instance (`local_use_count() > 1`), there are no side effects. - If `*this` is empty, or shares ownership with another `local_shared_ptr` instance (`local_use_count() > 1`), there are no side effects.
- Otherwise, destroys the owned `shared_ptr`. - Otherwise, destroys the owned `shared_ptr`.
@ -360,7 +382,9 @@ local_shared_ptr & operator=(local_shared_ptr const & r) noexcept;
``` ```
template<class Y> local_shared_ptr & operator=(local_shared_ptr<Y> const & r) noexcept; template<class Y> local_shared_ptr & operator=(local_shared_ptr<Y> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(r).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(r).swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
@ -373,14 +397,18 @@ template<class Y> local_shared_ptr & operator=(local_shared_ptr<Y> && r) noexcep
``` ```
template<class Y, class D> local_shared_ptr & operator=(std::unique_ptr<Y, D> && r); template<class Y, class D> local_shared_ptr & operator=(std::unique_ptr<Y, D> && r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(std::move(r)).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(std::move(r)).swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
``` ```
local_shared_ptr & operator=(std::nullptr_t) noexcept; local_shared_ptr & operator=(std::nullptr_t) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr().swap(*this)`. Effects:: Equivalent to `local_shared_ptr().swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
@ -388,58 +416,76 @@ Returns:: `*this`.
``` ```
void reset() noexcept; void reset() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr().swap(*this)`. Effects:: Equivalent to `local_shared_ptr().swap(*this)`.
``` ```
template<class Y> void reset(Y * p); template<class Y> void reset(Y * p);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(p).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(p).swap(*this)`.
``` ```
template<class Y, class D> void reset(Y * p, D d); template<class Y, class D> void reset(Y * p, D d);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(p, d).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(p, d).swap(*this)`.
``` ```
template<class Y, class D, class A> void reset(Y * p, D d, A a); template<class Y, class D, class A> void reset(Y * p, D d, A a);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(p, d, a).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(p, d, a).swap(*this)`.
``` ```
template<class Y> void reset(local_shared_ptr<Y> const & r, element_type * p) noexcept; template<class Y> void reset(local_shared_ptr<Y> const & r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(r, p).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(r, p).swap(*this)`.
``` ```
template<class Y> void reset(local_shared_ptr<Y> && r, element_type * p) noexcept; template<class Y> void reset(local_shared_ptr<Y> && r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `local_shared_ptr(std::move(r), p).swap(*this)`. Effects:: Equivalent to `local_shared_ptr(std::move(r), p).swap(*this)`.
### indirection ### indirection
``` ```
T & operator*() const noexcept; T & operator*() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T` should not be an array type. Requires:: `T` should not be an array type.
Returns:: `*get()`. Returns:: `*get()`.
``` ```
T * operator->() const noexcept; T * operator->() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T` should not be an array type. Requires:: `T` should not be an array type.
Returns:: `get()`. Returns:: `get()`.
``` ```
element_type & operator[](std::ptrdiff_t i) const noexcept; element_type & operator[](std::ptrdiff_t i) const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T` should be an array type. The stored pointer must not be 0. `i >= 0`. If `T` is `U[N]`, `i < N`. Requires:: `T` should be an array type. The stored pointer must not be 0. `i >= 0`. If `T` is `U[N]`, `i < N`.
Returns:: `get()[i]`. Returns:: `get()[i]`.
@ -448,21 +494,27 @@ Returns:: `get()[i]`.
``` ```
element_type * get() const noexcept; element_type * get() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The stored pointer. Returns:: The stored pointer.
### local_use_count ### local_use_count
``` ```
long local_use_count() const noexcept; long local_use_count() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The number of `local_shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty. Returns:: The number of `local_shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty.
### conversions ### conversions
``` ```
explicit operator bool() const noexcept; explicit operator bool() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `get() != 0`. Returns:: `get() != 0`.
NOTE: On C++03 compilers, the return value is of an unspecified type. NOTE: On C++03 compilers, the return value is of an unspecified type.
@ -473,7 +525,9 @@ template<class Y> operator shared_ptr<Y>() const noexcept;
``` ```
template<class Y> operator weak_ptr<Y>() const noexcept; template<class Y> operator weak_ptr<Y>() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T*` should be convertible to `Y*`. Requires:: `T*` should be convertible to `Y*`.
Returns:: a copy of the owned `shared_ptr`. Returns:: a copy of the owned `shared_ptr`.
@ -481,14 +535,18 @@ Returns:: a copy of the owned `shared_ptr`.
``` ```
void swap(local_shared_ptr & b) noexcept; void swap(local_shared_ptr & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Exchanges the contents of the two smart pointers. Effects:: Exchanges the contents of the two smart pointers.
### owner_before ### owner_before
``` ```
template<class Y> bool owner_before(local_shared_ptr<Y> const & rhs) const noexcept; template<class Y> bool owner_before(local_shared_ptr<Y> const & rhs) const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: See the description of `operator<`. Effects:: See the description of `operator<`.
## Free Functions ## Free Functions
@ -506,7 +564,9 @@ template<class T, class U>
template<class T, class U> template<class T, class U>
bool operator==(shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept; bool operator==(shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() == b.get()`. Returns:: `a.get() == b.get()`.
``` ```
@ -521,7 +581,9 @@ template<class T, class U>
template<class T, class U> template<class T, class U>
bool operator!=(shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept; bool operator!=(shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() != b.get()`. Returns:: `a.get() != b.get()`.
``` ```
@ -530,7 +592,9 @@ template<class T> bool operator==(local_shared_ptr<T> const & p, std::nullptr_t)
``` ```
template<class T> bool operator==(std::nullptr_t, local_shared_ptr<T> const & p) noexcept; template<class T> bool operator==(std::nullptr_t, local_shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get() == 0`. Returns:: `p.get() == 0`.
``` ```
@ -539,14 +603,18 @@ template<class T> bool operator!=(local_shared_ptr<T> const & p, std::nullptr_t)
``` ```
template<class T> bool operator!=(std::nullptr_t, local_shared_ptr<T> const & p) noexcept; template<class T> bool operator!=(std::nullptr_t, local_shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get() != 0`. Returns:: `p.get() != 0`.
``` ```
template<class T, class U> template<class T, class U>
bool operator<(local_shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept; bool operator<(local_shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: An unspecified value such that Returns:: An unspecified value such that
- `operator<` is a strict weak ordering as described in section [lib.alg.sorting] of the {cpp} standard; - `operator<` is a strict weak ordering as described in section [lib.alg.sorting] of the {cpp} standard;
- under the equivalence relation defined by `operator<`, `!(a < b) && !(b < a)`, two `local_shared_ptr` instances - under the equivalence relation defined by `operator<`, `!(a < b) && !(b < a)`, two `local_shared_ptr` instances
@ -560,7 +628,9 @@ NOTE: The rest of the comparison operators are omitted by design.
``` ```
template<class T> void swap(local_shared_ptr<T> & a, local_shared_ptr<T> & b) noexcept; template<class T> void swap(local_shared_ptr<T> & a, local_shared_ptr<T> & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `a.swap(b)`. Effects:: Equivalent to `a.swap(b)`.
### get_pointer ### get_pointer
@ -569,7 +639,9 @@ template<class T>
typename local_shared_ptr<T>::element_type * typename local_shared_ptr<T>::element_type *
get_pointer(local_shared_ptr<T> const & p) noexcept; get_pointer(local_shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get()`. Returns:: `p.get()`.
NOTE: Provided as an aid to generic programming. Used by `mem_fn`. NOTE: Provided as an aid to generic programming. Used by `mem_fn`.
@ -579,7 +651,9 @@ NOTE: Provided as an aid to generic programming. Used by `mem_fn`.
template<class T, class U> template<class T, class U>
local_shared_ptr<T> static_pointer_cast(local_shared_ptr<U> const & r) noexcept; local_shared_ptr<T> static_pointer_cast(local_shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `static_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `static_cast<T*>( (U*)0 )` must be well-formed.
Returns:: `local_shared_ptr<T>( r, static_cast<typename local_shared_ptr<T>::element_type*>(r.get()) )`. Returns:: `local_shared_ptr<T>( r, static_cast<typename local_shared_ptr<T>::element_type*>(r.get()) )`.
@ -591,7 +665,9 @@ result in undefined behavior, attempting to delete the same object twice.
template<class T, class U> template<class T, class U>
local_shared_ptr<T> const_pointer_cast(local_shared_ptr<U> const & r) noexcept; local_shared_ptr<T> const_pointer_cast(local_shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `const_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `const_cast<T*>( (U*)0 )` must be well-formed.
Returns:: `local_shared_ptr<T>( r, const_cast<typename local_shared_ptr<T>::element_type*>(r.get()) )`. Returns:: `local_shared_ptr<T>( r, const_cast<typename local_shared_ptr<T>::element_type*>(r.get()) )`.
@ -600,7 +676,9 @@ Returns:: `local_shared_ptr<T>( r, const_cast<typename local_shared_ptr<T>::elem
template<class T, class U> template<class T, class U>
local_shared_ptr<T> dynamic_pointer_cast(local_shared_ptr<U> const & r) noexcept; local_shared_ptr<T> dynamic_pointer_cast(local_shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `dynamic_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `dynamic_cast<T*>( (U*)0 )` must be well-formed.
Returns:: Returns::
- When `dynamic_cast<typename local_shared_ptr<T>::element_type*>(r.get())` returns a nonzero value `p`, `local_shared_ptr<T>(r, p)`; - When `dynamic_cast<typename local_shared_ptr<T>::element_type*>(r.get())` returns a nonzero value `p`, `local_shared_ptr<T>(r, p)`;
@ -611,7 +689,9 @@ Returns::
template<class T, class U> template<class T, class U>
local_shared_ptr<T> reinterpret_pointer_cast(local_shared_ptr<U> const & r) noexcept; local_shared_ptr<T> reinterpret_pointer_cast(local_shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `reinterpret_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `reinterpret_cast<T*>( (U*)0 )` must be well-formed.
Returns:: `local_shared_ptr<T>( r, reinterpret_cast<typename local_shared_ptr<T>::element_type*>(r.get()) )`. Returns:: `local_shared_ptr<T>( r, reinterpret_cast<typename local_shared_ptr<T>::element_type*>(r.get()) )`.
@ -621,7 +701,9 @@ template<class E, class T, class Y>
std::basic_ostream<E, T> & std::basic_ostream<E, T> &
operator<< (std::basic_ostream<E, T> & os, local_shared_ptr<Y> const & p); operator<< (std::basic_ostream<E, T> & os, local_shared_ptr<Y> const & p);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `os << p.get();`. Effects:: `os << p.get();`.
Returns:: `os`. Returns:: `os`.
@ -630,6 +712,7 @@ Returns:: `os`.
template<class D, class T> template<class D, class T>
D * get_deleter(local_shared_ptr<T> const & p) noexcept; D * get_deleter(local_shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: If `*this` owns a `shared_ptr` instance `p`, `get_deleter<D>( p )`, otherwise 0. Returns:: If `*this` owns a `shared_ptr` instance `p`, `get_deleter<D>( p )`, otherwise 0.

View File

@ -178,7 +178,9 @@ template<class T, class... Args>
template<class T, class A, class... Args> template<class T, class A, class... Args>
shared_ptr<T> allocate_shared(const A& a, Args&&... args); shared_ptr<T> allocate_shared(const A& a, Args&&... args);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is not an array type. `T` is not an array type.
Returns:: A `shared_ptr` to an object of type `T`, constructed from Returns:: A `shared_ptr` to an object of type `T`, constructed from
@ -195,7 +197,9 @@ template<class T>
template<class T, class A> template<class T, class A>
shared_ptr<T> allocate_shared(const A& a, std::size_t n); shared_ptr<T> allocate_shared(const A& a, std::size_t n);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[]`. `T` is an array type of the form `U[]`.
Returns:: A `shared_ptr` to a sequence of `n` value-initialized objects of Returns:: A `shared_ptr` to a sequence of `n` value-initialized objects of
@ -212,7 +216,9 @@ template<class T>
template<class T, class A> template<class T, class A>
shared_ptr<T> allocate_shared(const A& a); shared_ptr<T> allocate_shared(const A& a);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[N]`. `T` is an array type of the form `U[N]`.
Returns:: A `shared_ptr` to a sequence of `N` value-initialized objects of Returns:: A `shared_ptr` to a sequence of `N` value-initialized objects of
@ -229,7 +235,9 @@ template<class T> shared_ptr<T>
template<class T, class A> shared_ptr<T> template<class T, class A> shared_ptr<T>
allocate_shared(const A& a, std::size_t n, const remove_extent_t<T>& v); allocate_shared(const A& a, std::size_t n, const remove_extent_t<T>& v);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[]`. `T` is an array type of the form `U[]`.
Returns:: A `shared_ptr` to a sequence of `n` objects of type `U`, each Returns:: A `shared_ptr` to a sequence of `n` objects of type `U`, each
@ -247,7 +255,9 @@ template<class T>
template<class T, class A> template<class T, class A>
shared_ptr<T> allocate_shared(const A& a, const remove_extent_t<T>& v); shared_ptr<T> allocate_shared(const A& a, const remove_extent_t<T>& v);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[N]`. `T` is an array type of the form `U[N]`.
Returns:: A `shared_ptr` to a sequence of `N` objects of type `U`, each Returns:: A `shared_ptr` to a sequence of `N` objects of type `U`, each
@ -265,7 +275,9 @@ template<class T>
template<class T, class A> template<class T, class A>
shared_ptr<T> allocate_shared_noinit(const A& a); shared_ptr<T> allocate_shared_noinit(const A& a);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is not an array type, or an array type of the `U[N]`. `T` is not an array type, or an array type of the `U[N]`.
Returns:: A `shared_ptr` to a default-initialized object of type `T`, or a Returns:: A `shared_ptr` to a default-initialized object of type `T`, or a
@ -280,7 +292,9 @@ template<class T>
template<class T, class A> template<class T, class A>
shared_ptr<T> allocate_shared_noinit(const A& a, std::size_t n); shared_ptr<T> allocate_shared_noinit(const A& a, std::size_t n);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[]`. `T` is an array type of the form `U[]`.
Returns:: A `shared_ptr` to a sequence of `_n_` default-initialized objects Returns:: A `shared_ptr` to a sequence of `_n_` default-initialized objects

View File

@ -68,7 +68,9 @@ namespace boost {
template<class T, class... Args> template<class T, class... Args>
std::unique_ptr<T> make_unique(Args&&... args); std::unique_ptr<T> make_unique(Args&&... args);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is not an array type. `T` is not an array type.
Returns:: `std::unique_ptr<T>(new T(std::forward<Args>(args)\...)`. Returns:: `std::unique_ptr<T>(new T(std::forward<Args>(args)\...)`.
@ -78,7 +80,9 @@ Example:: `auto p = make_unique<int>();`
template<class T> template<class T>
std::unique_ptr<T> make_unique(remove_reference_t<T>&& v); std::unique_ptr<T> make_unique(remove_reference_t<T>&& v);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is not an array type. `T` is not an array type.
Returns:: `std::unique_ptr<T>(new T(std::move(v))`. Returns:: `std::unique_ptr<T>(new T(std::move(v))`.
@ -88,7 +92,9 @@ Example:: `auto p = make_unique<std::vector<int> >({1, 2});`
template<class T> template<class T>
std::unique_ptr<T> make_unique(std::size_t n); std::unique_ptr<T> make_unique(std::size_t n);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[]`. `T` is an array type of the form `U[]`.
Returns:: `std::unique_ptr<U[]>(new U[n]())`. Returns:: `std::unique_ptr<U[]>(new U[n]())`.
@ -98,7 +104,9 @@ Example:: `auto p = make_unique<double[]>(1024);`
template<class T> template<class T>
std::unique_ptr<T> make_unique_noinit(); std::unique_ptr<T> make_unique_noinit();
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is not an array type. `T` is not an array type.
Returns:: `std::unique_ptr<T>(new T)`. Returns:: `std::unique_ptr<T>(new T)`.
@ -108,7 +116,9 @@ Example:: `auto p = make_unique_noinit<double[1024]>();`
template<class T> template<class T>
std::unique_ptr<T> make_unique_noinit(std::size_t n); std::unique_ptr<T> make_unique_noinit(std::size_t n);
``` ```
[horizontal] [none]
* {blank}
+
Remarks:: These overloads shall only participate in overload resolution when Remarks:: These overloads shall only participate in overload resolution when
`T` is an array type of the form `U[]`. `T` is an array type of the form `U[]`.
Returns:: `std::unique_ptr<U[]>(new U[n])`. Returns:: `std::unique_ptr<U[]>(new U[n])`.

View File

@ -78,21 +78,27 @@ namespace boost {
``` ```
template<class T, class U> T* static_pointer_cast(U* p) noexcept; template<class T, class U> T* static_pointer_cast(U* p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `static_cast<T*>(p)` Returns:: `static_cast<T*>(p)`
``` ```
template<class T, class U> std::shared_ptr<T> template<class T, class U> std::shared_ptr<T>
static_pointer_cast(const std::shared_ptr<U>& p) noexcept; static_pointer_cast(const std::shared_ptr<U>& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `std::static_pointer_cast<T>(p)` Returns:: `std::static_pointer_cast<T>(p)`
``` ```
template<class T, class U> std::unique_ptr<T> template<class T, class U> std::unique_ptr<T>
static_pointer_cast(std::unique_ptr<U>&& p) noexcept; static_pointer_cast(std::unique_ptr<U>&& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `static_cast<T*>((U*)0)` must be well-formed. Requires:: The expression `static_cast<T*>((U*)0)` must be well-formed.
Returns:: `std::unique_ptr<T>(static_cast<typename Returns:: `std::unique_ptr<T>(static_cast<typename
std::unique_ptr<T>::element_type*>(p.release()))`. std::unique_ptr<T>::element_type*>(p.release()))`.
@ -106,21 +112,27 @@ undefined behavior, attempting to delete the same object twice.
``` ```
template<class T, class U> T* dynamic_pointer_cast(U* p) noexcept; template<class T, class U> T* dynamic_pointer_cast(U* p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `dynamic_cast<T*>(p)` Returns:: `dynamic_cast<T*>(p)`
``` ```
template<class T, class U> std::shared_ptr<T> template<class T, class U> std::shared_ptr<T>
dynamic_pointer_cast(const std::shared_ptr<U>& p) noexcept; dynamic_pointer_cast(const std::shared_ptr<U>& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `std::dynamic_pointer_cast<T>(p)` Returns:: `std::dynamic_pointer_cast<T>(p)`
``` ```
template<class T, class U> std::unique_ptr<T> template<class T, class U> std::unique_ptr<T>
dynamic_pointer_cast(std::unique_ptr<U>&& p) noexcept; dynamic_pointer_cast(std::unique_ptr<U>&& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: Requires::
* The expression `static_cast<T*>((U*)0)` must be well-formed. * The expression `static_cast<T*>((U*)0)` must be well-formed.
* `T` must have a virtual destructor. * `T` must have a virtual destructor.
@ -135,21 +147,27 @@ std::unique_ptr<T>::element_type*>(p.release()));`.
``` ```
template<class T, class U> T* const_pointer_cast(U* p) noexcept; template<class T, class U> T* const_pointer_cast(U* p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `const_cast<T*>(p)` Returns:: `const_cast<T*>(p)`
``` ```
template<class T, class U> std::shared_ptr<T> template<class T, class U> std::shared_ptr<T>
const_pointer_cast(const std::shared_ptr<U>& p) noexcept; const_pointer_cast(const std::shared_ptr<U>& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `std::const_pointer_cast<T>(p)` Returns:: `std::const_pointer_cast<T>(p)`
``` ```
template<class T, class U> std::unique_ptr<T> template<class T, class U> std::unique_ptr<T>
const_pointer_cast(std::unique_ptr<U>&& p) noexcept; const_pointer_cast(std::unique_ptr<U>&& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `const_cast<T*>((U*)0)` must be well-formed. Requires:: The expression `const_cast<T*>((U*)0)` must be well-formed.
Returns:: `std::unique_ptr<T>(const_cast<typename Returns:: `std::unique_ptr<T>(const_cast<typename
std::unique_ptr<T>::element_type*>(p.release()))`. std::unique_ptr<T>::element_type*>(p.release()))`.
@ -159,21 +177,27 @@ std::unique_ptr<T>::element_type*>(p.release()))`.
``` ```
template<class T, class U> T* reinterpret_pointer_cast(U* p) noexcept; template<class T, class U> T* reinterpret_pointer_cast(U* p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `reinterpret_cast<T*>(p)` Returns:: `reinterpret_cast<T*>(p)`
``` ```
template<class T, class U> std::shared_ptr<T> template<class T, class U> std::shared_ptr<T>
reinterpret_pointer_cast(const std::shared_ptr<U>& p) noexcept; reinterpret_pointer_cast(const std::shared_ptr<U>& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `std::reinterpret_pointer_cast<T>(p)` Returns:: `std::reinterpret_pointer_cast<T>(p)`
``` ```
template<class T, class U> std::unique_ptr<T> template<class T, class U> std::unique_ptr<T>
reinterpret_pointer_cast(std::unique_ptr<U>&& p) noexcept; reinterpret_pointer_cast(std::unique_ptr<U>&& p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `reinterpret_cast<T*>((U*)0)` must be well-formed. Requires:: The expression `reinterpret_cast<T*>((U*)0)` must be well-formed.
Returns:: `std::unique_ptr<T>(reinterpret_cast<typename Returns:: `std::unique_ptr<T>(reinterpret_cast<typename
std::unique_ptr<T>::element_type*>(p.release()))`. std::unique_ptr<T>::element_type*>(p.release()))`.
@ -210,4 +234,4 @@ int main()
delete ptr; delete ptr;
} }
``` ```

View File

@ -105,7 +105,9 @@ Type:: Provides the type of the stored pointer.
``` ```
explicit shared_array(T* p = 0); explicit shared_array(T* p = 0);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `shared_array`, storing a copy of `p`, which must be a Effects:: Constructs a `shared_array`, storing a copy of `p`, which must be a
pointer to an array that was allocated via a C++ `new[]` expression or be 0. pointer to an array that was allocated via a C++ `new[]` expression or be 0.
Afterwards, the use count is 1 (even if `p == 0`; see `~shared_array`). Afterwards, the use count is 1 (even if `p == 0`; see `~shared_array`).
@ -115,11 +117,13 @@ Throws:: `std::bad_alloc`. If an exception is thrown, `delete[] p` is called.
``` ```
template<class D> shared_array(T* p, D d); template<class D> shared_array(T* p, D d);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `shared_array`, storing a copy of `p` and of `d`. Effects:: Constructs a `shared_array`, storing a copy of `p` and of `d`.
Afterwards, the use count is 1. When the the time comes to delete the array Afterwards, the use count is 1. When the the time comes to delete the array
pointed to by `p`, the object `d` is used in the statement `d(p)`. pointed to by `p`, the object `d` is used in the statement `d(p)`.
Requires[horizontal] Requires::
* `T` is a complete type. * `T` is a complete type.
* The copy constructor and destructor of `D` must not throw. * The copy constructor and destructor of `D` must not throw.
* Invoking the object `d` with parameter `p` must not throw. * Invoking the object `d` with parameter `p` must not throw.
@ -128,7 +132,9 @@ Throws:: `std::bad_alloc`. If an exception is thrown, `d(p)` is called.
``` ```
shared_array(const shared_array& v) noexcept; shared_array(const shared_array& v) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `shared_array`, as if by storing a copy of the pointer Effects:: Constructs a `shared_array`, as if by storing a copy of the pointer
stored in `v`. Afterwards, the use count for all copies is 1 more than the stored in `v`. Afterwards, the use count for all copies is 1 more than the
initial use count. initial use count.
@ -139,7 +145,9 @@ Requires:: `T` is a complete type.
``` ```
~shared_array() noexcept; ~shared_array() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Decrements the use count. Then, if the use count is 0, deletes the Effects:: Decrements the use count. Then, if the use count is 0, deletes the
array pointed to by the stored pointer. Note that `delete[]` on a pointer with array pointed to by the stored pointer. Note that `delete[]` on a pointer with
a value of 0 is harmless. a value of 0 is harmless.
@ -149,7 +157,9 @@ a value of 0 is harmless.
``` ```
shared_array& operator=(const shared_array& v) noexcept; shared_array& operator=(const shared_array& v) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a new `shared_array` as described above, then replaces Effects:: Constructs a new `shared_array` as described above, then replaces
this `shared_array` with the new one, destroying the replaced object. this `shared_array` with the new one, destroying the replaced object.
Requires:: `T` is a complete type. Requires:: `T` is a complete type.
@ -160,7 +170,9 @@ Returns:: `*this`.
``` ```
void reset(T* p = 0); void reset(T* p = 0);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a new `shared_array` as described above, then replaces Effects:: Constructs a new `shared_array` as described above, then replaces
this `shared_array` with the new one, destroying the replaced object. this `shared_array` with the new one, destroying the replaced object.
Requires:: `T` is a complete type. Requires:: `T` is a complete type.
@ -169,10 +181,12 @@ Throws:: `std::bad_alloc`. If an exception is thrown, `delete[] p` is called.
``` ```
template<class D> void reset(T* p, D d); template<class D> void reset(T* p, D d);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a new `shared_array` as described above, then replaces Effects:: Constructs a new `shared_array` as described above, then replaces
this `shared_array` with the new one, destroying the replaced object. this `shared_array` with the new one, destroying the replaced object.
Requires[horizontal] Requires::
* `T` is a complete type. * `T` is a complete type.
* The copy constructor of `D` must not throw. * The copy constructor of `D` must not throw.
Throws:: `std::bad_alloc`. If an exception is thrown, `d(p)` is called. Throws:: `std::bad_alloc`. If an exception is thrown, `d(p)` is called.
@ -193,7 +207,9 @@ Requires:: `T` is a complete type.
``` ```
T* get() const noexcept; T* get() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The stored pointer. Returns:: The stored pointer.
### unique ### unique
@ -201,7 +217,9 @@ Returns:: The stored pointer.
``` ```
bool unique() const noexcept; bool unique() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `true` if no other `shared_array` is sharing ownership of the Returns:: `true` if no other `shared_array` is sharing ownership of the
stored pointer, `false` otherwise. stored pointer, `false` otherwise.
@ -210,7 +228,9 @@ stored pointer, `false` otherwise.
``` ```
long use_count() const noexcept; long use_count() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The number of `shared_array` objects sharing ownership of the Returns:: The number of `shared_array` objects sharing ownership of the
stored pointer. stored pointer.
@ -219,7 +239,9 @@ stored pointer.
``` ```
explicit operator bool() const noexcept; explicit operator bool() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `get() != 0`. Returns:: `get() != 0`.
Requires:: `T` is a complete type. Requires:: `T` is a complete type.
@ -228,7 +250,9 @@ Requires:: `T` is a complete type.
``` ```
void swap(shared_array<T>& b) noexcept; void swap(shared_array<T>& b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Exchanges the contents of the two smart pointers. Effects:: Exchanges the contents of the two smart pointers.
## Free Functions ## Free Functions
@ -247,7 +271,9 @@ template<class T> bool
template<class T> bool template<class T> bool
operator<(const shared_array<T>& a, const shared_array<T>& b) noexcept; operator<(const shared_array<T>& a, const shared_array<T>& b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The result of comparing the stored pointers of the two smart Returns:: The result of comparing the stored pointers of the two smart
pointers. pointers.
@ -265,6 +291,8 @@ mandates that relational operations on pointers are unspecified (5.9
template<class T> template<class T>
void swap(shared_array<T>& a, shared_array<T>& b) noexcept; void swap(shared_array<T>& a, shared_array<T>& b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.swap(b)`. Returns:: `a.swap(b)`.
Requires:: `T` is a complete type. Requires:: `T` is a complete type.

View File

@ -263,7 +263,9 @@ constexpr shared_ptr() noexcept;
``` ```
constexpr shared_ptr(std::nullptr_t) noexcept; constexpr shared_ptr(std::nullptr_t) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs an empty `shared_ptr`. Effects:: Constructs an empty `shared_ptr`.
Postconditions:: `use_count() == 0 && get() == 0`. Postconditions:: `use_count() == 0 && get() == 0`.
@ -271,7 +273,9 @@ Postconditions:: `use_count() == 0 && get() == 0`.
``` ```
template<class Y> explicit shared_ptr(Y * p); template<class Y> explicit shared_ptr(Y * p);
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y` must be a complete type. The expression `delete[] p`, when `T` is an array type, or `delete p`, when `T` is not an array type, Requires:: `Y` must be a complete type. The expression `delete[] p`, when `T` is an array type, or `delete p`, when `T` is not an array type,
must be well-formed, well-defined, and not throw exceptions. When `T` is `U[N]`, `Y(\*)[N]` must be convertible to `T*`; when `T` is `U[]`, `Y(\*)[]` must be well-formed, well-defined, and not throw exceptions. When `T` is `U[N]`, `Y(\*)[N]` must be convertible to `T*`; when `T` is `U[]`, `Y(\*)[]`
must be convertible to `T*`; otherwise, `Y\*` must be convertible to `T*`. must be convertible to `T*`; otherwise, `Y\*` must be convertible to `T*`.
@ -305,7 +309,9 @@ template<class D> shared_ptr(std::nullptr_t p, D d);
``` ```
template<class D, class A> shared_ptr(std::nullptr_t p, D d, A a); template<class D, class A> shared_ptr(std::nullptr_t p, D d, A a);
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `D` must be `CopyConstructible`. The copy constructor and destructor of `D` must not throw. The expression `d(p)` must be well-formed, well-defined, Requires:: `D` must be `CopyConstructible`. The copy constructor and destructor of `D` must not throw. The expression `d(p)` must be well-formed, well-defined,
and not throw exceptions. `A` must be an `Allocator`, as described in section Allocator Requirements [allocator.requirements] of the {cpp} Standard. and not throw exceptions. `A` must be an `Allocator`, as described in section Allocator Requirements [allocator.requirements] of the {cpp} Standard.
When `T` is `U[N]`, `Y(\*)[N]` must be convertible to `T*`; when `T` is `U[]`, `Y(\*)[]` must be convertible to `T*`; otherwise, `Y\*` must be convertible to `T*`. When `T` is `U[N]`, `Y(\*)[N]` must be convertible to `T*`; when `T` is `U[]`, `Y(\*)[]` must be convertible to `T*`; otherwise, `Y\*` must be convertible to `T*`.
@ -335,7 +341,9 @@ shared_ptr(shared_ptr const & r) noexcept;
``` ```
template<class Y> shared_ptr(shared_ptr<Y> const & r) noexcept; template<class Y> shared_ptr(shared_ptr<Y> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: If `r` is empty, constructs an empty `shared_ptr`; otherwise, constructs a `shared_ptr` that shares ownership with `r`. Effects:: If `r` is empty, constructs an empty `shared_ptr`; otherwise, constructs a `shared_ptr` that shares ownership with `r`.
@ -349,7 +357,9 @@ shared_ptr(shared_ptr && r) noexcept;
``` ```
template<class Y> shared_ptr(shared_ptr<Y> && r) noexcept; template<class Y> shared_ptr(shared_ptr<Y> && r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: Move-constructs a `shared_ptr` from `r`. Effects:: Move-constructs a `shared_ptr` from `r`.
@ -360,7 +370,9 @@ Postconditions:: `*this` contains the old value of `r`. `r` is empty and `r.get(
``` ```
template<class Y> shared_ptr(shared_ptr<Y> const & r, element_type * p) noexcept; template<class Y> shared_ptr(shared_ptr<Y> const & r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: constructs a `shared_ptr` that shares ownership with `r` and stores `p`. Effects:: constructs a `shared_ptr` that shares ownership with `r` and stores `p`.
Postconditions:: `get() == p && use_count() == r.use_count()`. Postconditions:: `get() == p && use_count() == r.use_count()`.
@ -369,7 +381,9 @@ Postconditions:: `get() == p && use_count() == r.use_count()`.
``` ```
template<class Y> shared_ptr(shared_ptr<Y> && r, element_type * p) noexcept; template<class Y> shared_ptr(shared_ptr<Y> && r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Move-constructs a `shared_ptr` from `r`, while storing `p` instead. Effects:: Move-constructs a `shared_ptr` from `r`, while storing `p` instead.
Postconditions:: `get() == p` and `use_count()` equals the old count of `r`. `r` is empty and `r.get() == 0`. Postconditions:: `get() == p` and `use_count()` equals the old count of `r`. `r` is empty and `r.get() == 0`.
@ -378,7 +392,9 @@ Postconditions:: `get() == p` and `use_count()` equals the old count of `r`. `r`
``` ```
template<class Y> explicit shared_ptr(weak_ptr<Y> const & r); template<class Y> explicit shared_ptr(weak_ptr<Y> const & r);
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: Constructs a `shared_ptr` that shares ownership with `r` and stores a copy of the pointer stored in `r`. Effects:: Constructs a `shared_ptr` that shares ownership with `r` and stores a copy of the pointer stored in `r`.
@ -396,7 +412,9 @@ template<class Y> shared_ptr(std::auto_ptr<Y> & r);
``` ```
template<class Y> shared_ptr(std::auto_ptr<Y> && r); template<class Y> shared_ptr(std::auto_ptr<Y> && r);
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: Constructs a `shared_ptr`, as if by storing a copy of `r.release()`. Effects:: Constructs a `shared_ptr`, as if by storing a copy of `r.release()`.
@ -411,7 +429,9 @@ Exception safety:: If an exception is thrown, the constructor has no effect.
``` ```
template<class Y, class D> shared_ptr(std::unique_ptr<Y, D> && r); template<class Y, class D> shared_ptr(std::unique_ptr<Y, D> && r);
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `Y*` should be convertible to `T*`. Requires:: `Y*` should be convertible to `T*`.
Effects:: Effects::
@ -428,7 +448,9 @@ Exception safety:: If an exception is thrown, the constructor has no effect.
``` ```
~shared_ptr() noexcept; ~shared_ptr() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Effects::
- If `*this` is empty, or shares ownership with another `shared_ptr` instance (`use_count() > 1`), there are no side effects. - If `*this` is empty, or shares ownership with another `shared_ptr` instance (`use_count() > 1`), there are no side effects.
- Otherwise, if `*this` owns a pointer `p` and a deleter `d`, `d(p)` is called. - Otherwise, if `*this` owns a pointer `p` and a deleter `d`, `d(p)` is called.
@ -444,7 +466,9 @@ template<class Y> shared_ptr & operator=(shared_ptr<Y> const & r) noexcept;
``` ```
template<class Y> shared_ptr & operator=(std::auto_ptr<Y> & r); template<class Y> shared_ptr & operator=(std::auto_ptr<Y> & r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(r).swap(*this)`. Effects:: Equivalent to `shared_ptr(r).swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
@ -475,14 +499,18 @@ template<class Y> shared_ptr & operator=(std::auto_ptr<Y> && r);
``` ```
template<class Y, class D> shared_ptr & operator=(std::unique_ptr<Y, D> && r); template<class Y, class D> shared_ptr & operator=(std::unique_ptr<Y, D> && r);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(std::move(r)).swap(*this)`. Effects:: Equivalent to `shared_ptr(std::move(r)).swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
``` ```
shared_ptr & operator=(std::nullptr_t) noexcept; shared_ptr & operator=(std::nullptr_t) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr().swap(*this)`. Effects:: Equivalent to `shared_ptr().swap(*this)`.
Returns:: `*this`. Returns:: `*this`.
@ -490,58 +518,76 @@ Returns:: `*this`.
``` ```
void reset() noexcept; void reset() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr().swap(*this)`. Effects:: Equivalent to `shared_ptr().swap(*this)`.
``` ```
template<class Y> void reset(Y * p); template<class Y> void reset(Y * p);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(p).swap(*this)`. Effects:: Equivalent to `shared_ptr(p).swap(*this)`.
``` ```
template<class Y, class D> void reset(Y * p, D d); template<class Y, class D> void reset(Y * p, D d);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(p, d).swap(*this)`. Effects:: Equivalent to `shared_ptr(p, d).swap(*this)`.
``` ```
template<class Y, class D, class A> void reset(Y * p, D d, A a); template<class Y, class D, class A> void reset(Y * p, D d, A a);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(p, d, a).swap(*this)`. Effects:: Equivalent to `shared_ptr(p, d, a).swap(*this)`.
``` ```
template<class Y> void reset(shared_ptr<Y> const & r, element_type * p) noexcept; template<class Y> void reset(shared_ptr<Y> const & r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(r, p).swap(*this)`. Effects:: Equivalent to `shared_ptr(r, p).swap(*this)`.
``` ```
template<class Y> void reset(shared_ptr<Y> && r, element_type * p) noexcept; template<class Y> void reset(shared_ptr<Y> && r, element_type * p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `shared_ptr(std::move(r), p).swap(*this)`. Effects:: Equivalent to `shared_ptr(std::move(r), p).swap(*this)`.
### indirection ### indirection
``` ```
T & operator*() const noexcept; T & operator*() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T` should not be an array type. The stored pointer must not be 0. Requires:: `T` should not be an array type. The stored pointer must not be 0.
Returns:: `*get()`. Returns:: `*get()`.
``` ```
T * operator->() const noexcept; T * operator->() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T` should not be an array type. The stored pointer must not be 0. Requires:: `T` should not be an array type. The stored pointer must not be 0.
Returns:: `get()`. Returns:: `get()`.
``` ```
element_type & operator[](std::ptrdiff_t i) const noexcept; element_type & operator[](std::ptrdiff_t i) const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: `T` should be an array type. The stored pointer must not be 0. `i >= 0`. If `T` is `U[N]`, `i < N`. Requires:: `T` should be an array type. The stored pointer must not be 0. `i >= 0`. If `T` is `U[N]`, `i < N`.
Returns:: `get()[i]`. Returns:: `get()[i]`.
@ -550,28 +596,36 @@ Returns:: `get()[i]`.
``` ```
element_type * get() const noexcept; element_type * get() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The stored pointer. Returns:: The stored pointer.
### unique ### unique
``` ```
bool unique() const noexcept; bool unique() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `use_count() == 1`. Returns:: `use_count() == 1`.
### use_count ### use_count
``` ```
long use_count() const noexcept; long use_count() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: The number of `shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty. Returns:: The number of `shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty.
### conversions ### conversions
``` ```
explicit operator bool() const noexcept; explicit operator bool() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `get() != 0`. Returns:: `get() != 0`.
NOTE: This conversion operator allows `shared_ptr` objects to be used in boolean contexts, like `if(p && p\->valid()) {}`. NOTE: This conversion operator allows `shared_ptr` objects to be used in boolean contexts, like `if(p && p\->valid()) {}`.
@ -585,7 +639,9 @@ NOTE: On C++03 compilers, the return value is of an unspecified type.
``` ```
void swap(shared_ptr & b) noexcept; void swap(shared_ptr & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Exchanges the contents of the two smart pointers. Effects:: Exchanges the contents of the two smart pointers.
### owner_before ### owner_before
@ -595,7 +651,9 @@ template<class Y> bool owner_before(shared_ptr<Y> const & rhs) const noexcept;
``` ```
template<class Y> bool owner_before(weak_ptr<Y> const & rhs) const noexcept; template<class Y> bool owner_before(weak_ptr<Y> const & rhs) const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: See the description of `operator<`. Effects:: See the description of `operator<`.
## Free Functions ## Free Functions
@ -605,14 +663,18 @@ Effects:: See the description of `operator<`.
template<class T, class U> template<class T, class U>
bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept; bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() == b.get()`. Returns:: `a.get() == b.get()`.
``` ```
template<class T, class U> template<class T, class U>
bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept; bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `a.get() != b.get()`. Returns:: `a.get() != b.get()`.
``` ```
@ -621,7 +683,9 @@ template<class T> bool operator==(shared_ptr<T> const & p, std::nullptr_t) noexc
``` ```
template<class T> bool operator==(std::nullptr_t, shared_ptr<T> const & p) noexcept; template<class T> bool operator==(std::nullptr_t, shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get() == 0`. Returns:: `p.get() == 0`.
``` ```
@ -630,14 +694,18 @@ template<class T> bool operator!=(shared_ptr<T> const & p, std::nullptr_t) noexc
``` ```
template<class T> bool operator!=(std::nullptr_t, shared_ptr<T> const & p) noexcept; template<class T> bool operator!=(std::nullptr_t, shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get() != 0`. Returns:: `p.get() != 0`.
``` ```
template<class T, class U> template<class T, class U>
bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept; bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: An unspecified value such that Returns:: An unspecified value such that
- `operator<` is a strict weak ordering as described in section [lib.alg.sorting] of the {cpp} standard; - `operator<` is a strict weak ordering as described in section [lib.alg.sorting] of the {cpp} standard;
- under the equivalence relation defined by `operator<`, `!(a < b) && !(b < a)`, two `shared_ptr` instances - under the equivalence relation defined by `operator<`, `!(a < b) && !(b < a)`, two `shared_ptr` instances
@ -651,7 +719,9 @@ NOTE: The rest of the comparison operators are omitted by design.
``` ```
template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b) noexcept; template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `a.swap(b)`. Effects:: Equivalent to `a.swap(b)`.
### get_pointer ### get_pointer
@ -660,7 +730,9 @@ template<class T>
typename shared_ptr<T>::element_type * typename shared_ptr<T>::element_type *
get_pointer(shared_ptr<T> const & p) noexcept; get_pointer(shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `p.get()`. Returns:: `p.get()`.
NOTE: Provided as an aid to generic programming. Used by `mem_fn`. NOTE: Provided as an aid to generic programming. Used by `mem_fn`.
@ -670,7 +742,9 @@ NOTE: Provided as an aid to generic programming. Used by `mem_fn`.
template<class T, class U> template<class T, class U>
shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r) noexcept; shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `static_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `static_cast<T*>( (U*)0 )` must be well-formed.
Returns:: `shared_ptr<T>( r, static_cast<typename shared_ptr<T>::element_type*>(r.get()) )`. Returns:: `shared_ptr<T>( r, static_cast<typename shared_ptr<T>::element_type*>(r.get()) )`.
@ -682,7 +756,9 @@ result in undefined behavior, attempting to delete the same object twice.
template<class T, class U> template<class T, class U>
shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r) noexcept; shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `const_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `const_cast<T*>( (U*)0 )` must be well-formed.
Returns:: `shared_ptr<T>( r, const_cast<typename shared_ptr<T>::element_type*>(r.get()) )`. Returns:: `shared_ptr<T>( r, const_cast<typename shared_ptr<T>::element_type*>(r.get()) )`.
@ -691,7 +767,9 @@ Returns:: `shared_ptr<T>( r, const_cast<typename shared_ptr<T>::element_type*>(r
template<class T, class U> template<class T, class U>
shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r) noexcept; shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `dynamic_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `dynamic_cast<T*>( (U*)0 )` must be well-formed.
Returns:: Returns::
- When `dynamic_cast<typename shared_ptr<T>::element_type*>(r.get())` returns a nonzero value `p`, `shared_ptr<T>(r, p)`; - When `dynamic_cast<typename shared_ptr<T>::element_type*>(r.get())` returns a nonzero value `p`, `shared_ptr<T>(r, p)`;
@ -702,7 +780,9 @@ Returns::
template<class T, class U> template<class T, class U>
shared_ptr<T> reinterpret_pointer_cast(shared_ptr<U> const & r) noexcept; shared_ptr<T> reinterpret_pointer_cast(shared_ptr<U> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Requires:: The expression `reinterpret_cast<T*>( (U*)0 )` must be well-formed. Requires:: The expression `reinterpret_cast<T*>( (U*)0 )` must be well-formed.
Returns:: `shared_ptr<T>( r, reinterpret_cast<typename shared_ptr<T>::element_type*>(r.get()) )`. Returns:: `shared_ptr<T>( r, reinterpret_cast<typename shared_ptr<T>::element_type*>(r.get()) )`.
@ -712,7 +792,9 @@ template<class E, class T, class Y>
std::basic_ostream<E, T> & std::basic_ostream<E, T> &
operator<< (std::basic_ostream<E, T> & os, shared_ptr<Y> const & p); operator<< (std::basic_ostream<E, T> & os, shared_ptr<Y> const & p);
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `os << p.get();`. Effects:: `os << p.get();`.
Returns:: `os`. Returns:: `os`.
@ -721,7 +803,9 @@ Returns:: `os`.
template<class D, class T> template<class D, class T>
D * get_deleter(shared_ptr<T> const & p) noexcept; D * get_deleter(shared_ptr<T> const & p) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: If `*this` owns a deleter `d` of type (cv-unqualified) `D`, returns `&d`; otherwise returns 0. Returns:: If `*this` owns a deleter `d` of type (cv-unqualified) `D`, returns `&d`; otherwise returns 0.
### Atomic Access ### Atomic Access
@ -733,7 +817,9 @@ NOTE: The function in this section are atomic with respect to the first `shared_
``` ```
template<class T> bool atomic_is_lock_free( shared_ptr<T> const * p ) noexcept; template<class T> bool atomic_is_lock_free( shared_ptr<T> const * p ) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `false`. Returns:: `false`.
NOTE: This implementation is not lock-free. NOTE: This implementation is not lock-free.
@ -744,7 +830,9 @@ template<class T> shared_ptr<T> atomic_load( shared_ptr<T> const * p ) noexcept;
``` ```
template<class T> shared_ptr<T> atomic_load_explicit( shared_ptr<T> const * p, int ) noexcept; template<class T> shared_ptr<T> atomic_load_explicit( shared_ptr<T> const * p, int ) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `*p`. Returns:: `*p`.
NOTE: The `int` argument is the `memory_order`, but this implementation does not use it, as it's lock-based NOTE: The `int` argument is the `memory_order`, but this implementation does not use it, as it's lock-based
@ -758,7 +846,9 @@ template<class T>
template<class T> template<class T>
void atomic_store_explicit( shared_ptr<T> * p, shared_ptr<T> r, int ) noexcept; void atomic_store_explicit( shared_ptr<T> * p, shared_ptr<T> r, int ) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `p\->swap(r)`. Effects:: `p\->swap(r)`.
``` ```
@ -770,7 +860,9 @@ template<class T>
shared_ptr<T> atomic_exchange_explicit( shared_ptr<T> atomic_exchange_explicit(
shared_ptr<T> * p, shared_ptr<T> r, int ) noexcept; shared_ptr<T> * p, shared_ptr<T> r, int ) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: `p\->swap(r)`. Effects:: `p\->swap(r)`.
Returns:: The old value of `*p`. Returns:: The old value of `*p`.
@ -784,7 +876,9 @@ template<class T>
bool atomic_compare_exchange_explicit( bool atomic_compare_exchange_explicit(
shared_ptr<T> * p, shared_ptr<T> * v, shared_ptr<T> w, int, int ) noexcept; shared_ptr<T> * p, shared_ptr<T> * v, shared_ptr<T> w, int, int ) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: If `*p` is equivalent to `*v`, assigns `w` to `*p`, otherwise assigns `*p` to `*v`. Effects:: If `*p` is equivalent to `*v`, assigns `w` to `*p`, otherwise assigns `*p` to `*v`.
Returns:: `true` if `*p` was equivalent to `*v`, `false` otherwise. Returns:: `true` if `*p` was equivalent to `*v`, `false` otherwise.
Remarks:: Two `shared_ptr` instances are equivalent if they store the same pointer value and _share ownership_. Remarks:: Two `shared_ptr` instances are equivalent if they store the same pointer value and _share ownership_.

View File

@ -127,7 +127,9 @@ typedef ... element_type;
``` ```
weak_ptr() noexcept; weak_ptr() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs an empty `weak_ptr`. Effects:: Constructs an empty `weak_ptr`.
Postconditions:: `use_count() == 0`. Postconditions:: `use_count() == 0`.
@ -140,14 +142,18 @@ weak_ptr(weak_ptr const & r) noexcept;
``` ```
template<class Y> weak_ptr(weak_ptr<Y> const & r) noexcept; template<class Y> weak_ptr(weak_ptr<Y> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: If `r` is empty, constructs an empty `weak_ptr`; otherwise, constructs a `weak_ptr` that shares ownership with `r` as if by storing a copy of the pointer stored in `r`. Effects:: If `r` is empty, constructs an empty `weak_ptr`; otherwise, constructs a `weak_ptr` that shares ownership with `r` as if by storing a copy of the pointer stored in `r`.
Postconditions:: `use_count() == r.use_count()`. Postconditions:: `use_count() == r.use_count()`.
``` ```
weak_ptr(weak_ptr && r) noexcept; weak_ptr(weak_ptr && r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Constructs a `weak_ptr` that has the value `r` held. Effects:: Constructs a `weak_ptr` that has the value `r` held.
Postconditions:: `r` is empty. Postconditions:: `r` is empty.
@ -155,7 +161,9 @@ Postconditions:: `r` is empty.
``` ```
~weak_ptr() noexcept; ~weak_ptr() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Destroys this `weak_ptr` but has no effect on the object its stored pointer points to. Effects:: Destroys this `weak_ptr` but has no effect on the object its stored pointer points to.
### assignment ### assignment
@ -171,7 +179,9 @@ template<class Y> weak_ptr & operator=(weak_ptr<Y> const & r) noexcept;
``` ```
template<class Y> weak_ptr & operator=(shared_ptr<Y> const & r) noexcept; template<class Y> weak_ptr & operator=(shared_ptr<Y> const & r) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `weak_ptr(r).swap(*this)`. Effects:: Equivalent to `weak_ptr(r).swap(*this)`.
NOTE: The implementation is free to meet the effects (and the implied guarantees) via different means, without creating a temporary. NOTE: The implementation is free to meet the effects (and the implied guarantees) via different means, without creating a temporary.
@ -180,35 +190,45 @@ NOTE: The implementation is free to meet the effects (and the implied guarantees
``` ```
long use_count() const noexcept; long use_count() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: 0 if `*this` is empty; otherwise, the number of `shared_ptr` objects that share ownership with `*this`. Returns:: 0 if `*this` is empty; otherwise, the number of `shared_ptr` objects that share ownership with `*this`.
### expired ### expired
``` ```
bool expired() const noexcept; bool expired() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `use_count() == 0`. Returns:: `use_count() == 0`.
### lock ### lock
``` ```
shared_ptr<T> lock() const noexcept; shared_ptr<T> lock() const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: `expired()? shared_ptr<T>(): shared_ptr<T>(*this)`. Returns:: `expired()? shared_ptr<T>(): shared_ptr<T>(*this)`.
### reset ### reset
``` ```
void reset() noexcept; void reset() noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `weak_ptr().swap(*this)`. Effects:: Equivalent to `weak_ptr().swap(*this)`.
### swap ### swap
``` ```
void swap(weak_ptr & b) noexcept; void swap(weak_ptr & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Exchanges the contents of the two smart pointers. Effects:: Exchanges the contents of the two smart pointers.
``` ```
@ -217,7 +237,9 @@ template<class Y> bool owner_before( weak_ptr<Y> const & r ) const noexcept;
``` ```
template<class Y> bool owner_before( shared_ptr<Y> const & r ) const noexcept; template<class Y> bool owner_before( shared_ptr<Y> const & r ) const noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: See the description of `operator<`. Returns:: See the description of `operator<`.
## Free Functions ## Free Functions
@ -227,7 +249,9 @@ Returns:: See the description of `operator<`.
template<class T, class U> template<class T, class U>
bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b) noexcept; bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Returns:: An unspecified value such that Returns:: An unspecified value such that
- `operator<` is a strict weak ordering as described in section [lib.alg.sorting] of the {cpp} standard; - `operator<` is a strict weak ordering as described in section [lib.alg.sorting] of the {cpp} standard;
- under the equivalence relation defined by `operator<`, `!(a < b) && !(b < a)`, two `weak_ptr` instances - under the equivalence relation defined by `operator<`, `!(a < b) && !(b < a)`, two `weak_ptr` instances
@ -239,7 +263,9 @@ NOTE: Allows `weak_ptr` objects to be used as keys in associative containers.
``` ```
template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b) noexcept; template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b) noexcept;
``` ```
[horizontal] [none]
* {blank}
+
Effects:: Equivalent to `a.swap(b)`. Effects:: Equivalent to `a.swap(b)`.
## Frequently Asked Questions ## Frequently Asked Questions