std::experimental::shared_ptr<T>:: shared_ptr

From cppreference.com
constexpr shared_ptr ( ) noexcept ;
(1)
constexpr shared_ptr ( std:: nullptr_t ) noexcept ;
(2)
template < class Y >
explicit shared_ptr ( Y * ptr ) ;
(3)
template < class Y, class Deleter >
shared_ptr ( Y * ptr, Deleter d ) ;
(4)
template < class Deleter >
shared_ptr ( std:: nullptr_t ptr, Deleter d ) ;
(5)
template < class Y, class Deleter, class Alloc >
shared_ptr ( Y * ptr, Deleter d, Alloc alloc ) ;
(6)
template < class Deleter, class Alloc >
shared_ptr ( std:: nullptr_t ptr, Deleter d, Alloc alloc ) ;
(7)
template < class Y >
shared_ptr ( const shared_ptr < Y > & r, element_type * ptr ) noexcept ;
(8)
shared_ptr ( const shared_ptr & r ) noexcept ;
(9)
template < class Y >
shared_ptr ( const shared_ptr < Y > & r ) noexcept ;
(9)
shared_ptr ( shared_ptr && r ) noexcept ;
(10)
template < class Y >
shared_ptr ( shared_ptr < Y > && r ) noexcept ;
(10)
template < class Y >
explicit shared_ptr ( const std:: weak_ptr < Y > & r ) ;
(11)
template < class Y >
shared_ptr ( std:: auto_ptr < Y > && r ) ;
(12)
template < class Y, class Deleter >
shared_ptr ( std:: unique_ptr < Y,Deleter > && r ) ;
(13)

Constructs new shared_ptr from a variety of pointer types that refer to an object to manage.

For the purposes of the description below, a pointer type Y* is said to be compatible with a pointer type T* if either Y* is convertible to T* or Y is the array type U[N] and T is U cv [] (where cv is some set of cv-qualifiers).

1,2) Constructs a shared_ptr with no managed object, i.e. empty shared_ptr .
3-7) Constructs a shared_ptr with ptr as the pointer to the managed object. If T is an array type U[N] , Y(*)[N] must be convertible to T* . If T is an array type U[] , Y(*)[] must be convertible to T* . Otherwise, Y* must be convertible to T* . Additionally:
3) Uses a delete-expression ( delete ptr , if T is not an array type; delete [ ] ptr if T is an array type) as the deleter. Y must be a complete type. That delete expression must be well formed, have well-defined behavior and not throw any exceptions.
4,5) Uses the specified deleter d as the deleter. The expression d ( ptr ) must be well formed, have well-defined behavior and not throw any exceptions. Deleter must be CopyConstructible , and its copy constructor and destructor must not throw exceptions.
6,7) Same as (4,5) , but additionally uses a copy of alloc for allocation of data for internal use. Alloc must be a Allocator , and its copy constructor and destructor must not throw exceptions.
8) The aliasing constructor : constructs a shared_ptr which shares ownership information with r , but holds an unrelated and unmanaged pointer ptr . Even if this shared_ptr is the last of the group to go out of scope, it will call the destructor for the object originally managed by r . However, calling get() on this will always return a copy of ptr . It is the responsibility of the programmer to make sure that this ptr remains valid as long as this shared_ptr exists, such as in the typical use cases where ptr is a member of the object managed by r or is an alias (e.g., downcast) of r. get ( ) .
9) Constructs a shared_ptr which shares ownership of the object managed by r . If r manages no object, * this manages no object too. The template overload doesn't participate in overload resolution if Y* is not compatible with T* .
10) Move-constructs a shared_ptr from r . After the construction, * this contains a copy of the previous state of r , r is empty. The template overload doesn't participate in overload resolution if Y* is not compatible with T* .
11) Constructs a shared_ptr which shares ownership of the object managed by r . Y* must be compatible with T* . Note that r. lock ( ) may be used for the same purpose: the difference is that this constructor throws an exception if the argument is empty, while weak_ptr < T > :: lock ( ) constructs an empty shared_ptr in that case.
12) Constructs a shared_ptr that stores and owns the object formerly owned by r . Y* must be convertible to T* . After construction, r is empty.
13) Constructs a shared_ptr which manages the object currently managed by r . The deleter associated with r is stored for future deletion of the managed object. r manages no object after the call. This overload doesn't participate in overload resolution if Y* is not compatible with T* .
If D is a reference type, equivalent to shared_ptr ( r. release ( ) , std:: ref ( r. get_deleter ( ) ) . Otherwise, equivalent to shared_ptr ( r. release ( ) , r. get_deleter ( ) ) .

Notes

When constructing a shared_ptr from a raw pointer to an object of a type derived from std::experimental::enable_shared_from_this , the constructors of shared_ptr update the private weak_ptr member of the std::experimental::enable_shared_from_this base so that future calls to shared_from_this() would share ownership with the shared_ptr created by this raw pointer constructor.

The raw pointer overloads assume ownership of the pointed-to object, and so constructing a shared_ptr using the raw pointer overload for an object that is already managed by a shared_ptr may lead to undefined behavior, even if the object is of a type derived from std::experimental::enable_shared_from_this .

Parameters

ptr - a pointer to an object to manage
d - a deleter to use to destroy the object
alloc - an allocator to use for allocations of data for internal use
r - another smart pointer to share the ownership to or acquire the ownership from

Exceptions

3) std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. The applicable delete-expression ( delete ptr if T is not an array type, delete [ ] ptr otherwise) is called if an exception occurs.
4-7) std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. d ( ptr ) is called if an exception occurs.
11) std::bad_weak_ptr if r. expired ( ) == true . The constructor has no effect in this case.
12) std::bad_alloc if required additional memory could not be obtained. May throw implementation-defined exception for other errors. This constructor has no effect if an exception occurs.
13) If an exception is thrown, the constructor has no effects.

Example

See also

creates a shared pointer that manages a new object
(function template)
creates a shared pointer that manages a new object allocated using an allocator
(function template)