std::experimental::shared_ptr<T>::shared_ptr
来自cppreference.com
< cpp | experimental | shared ptr
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) | |
从各种指代要管理对象的指针类型构造新的 shared_ptr
。
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) 构造没有管理对象的
shared_ptr
,即空 shared_ptr
。3-7) 以 ptr 为指向被管理对象的指针来构造
shared_ptr
。如果 T
是数组类型 U[N]
,则 Y(*)[N]
必须可以转换为 T*
。如果 T
为数组类型 U[]
,则 Y(*)[]
必须可以转换为 T*
。否则,Y*
必须可以转换为 T*
。此外:3) 使用 delete-表达式(当
T
不是数组类型时为 delete ptr;如果 T
是数组类型时为 delete[] ptr)为删除器。Y
必须为完整类型。该 delete 表达式必须良构,具有良好定义的行为,且不抛出任何异常。4,5) 使用指定的删除器 d 为删除器。表达式 d(ptr) 必须良构,具有良好定义的行为,且不抛出任何异常。
Deleter
必须为可复制构造 (CopyConstructible) ,且其复制构造函数和析构函数不能抛出异常。8) 别名构造函数:构造与 {{c|r} 共享所有权的
shared_ptr
,但持有无关且未管理的指针 ptr。即便此 shared_ptr
是离开作用域组中最后一个,它仍将为原来由 r 管理的对象调用析构函数。不过,在其上调用 get()
将总是返回 ptr 的副本。程序员有责任确保,只要这个 shared_ptr
存在,ptr 就保持有效,比如在 ptr 为 r 所管理的对象的成员,或者为 r.get() 的别名(比如经向下转型)等典型使用情景。9) 构造共享 r 所管理对象的所有权的
shared_ptr
。如果 r 并不管理对象,则 *this 也不管理对象。如果 Y*
不兼容于 T*
,则模板重载不参与重载决议。10) 从 r 移动构造
shared_ptr
。经过构造后,*this 含义 r 之前状态的副本,r 为空。如果 Y*
不兼容于 T*
,则模板重载不参与重载决议。11) 构造共享 r 所管理对象的所有权的
shared_ptr
。Y*
必须兼容于 T*
。注意 r.lock() 可以用于相同目的:其差别在于此构造函数在实参为空时会抛出异常,而 weak_ptr<T>::lock() 在此情况下构造空 shared_ptr
。12) 构造存储并拥有 r 之前拥有的对象的
shared_ptr
。Y*
必须可以转换为 T*
。经过构造后,r 为空。13) 构造
如果
shared_ptr
,它管理当前由 r 管理的对象。存储 r 关联的删除器,以在未来删除所管理的对象。此调用后 r 不再管理对象。如果 Y*
不兼容于 T*
,则此重载不参与重载决议。如果
D
是引用类型,则等价于 shared_ptr(r.release(), std::ref(r.get_deleter())。否则,等价于 shared_ptr(r.release(), r.get_deleter())。注解
当从指向派生于 std::experimental::enable_shared_from_this 的类型的对象的裸指针来构造 shared_ptr
时,shared_ptr
的构造函数会更新 std::experimental::enable_shared_from_this 基类的私有 weak_ptr
成员,使得未来对 shared_from_this() 的调用将能与由此裸指针构造函数所创建的 shared_ptr
共享所有权。
裸指针重载假定所指向对象的所有权,因此对已经被 shared_ptr
管理的对象使用裸指针重载来构造 shared_ptr
可能导致未定义行为,即便该对象具有派生于 std::experimental::enable_shared_from_this 的类型也是如此。
参数
ptr | - | 指向被管理对象的指针 |
d | - | 用于销毁对象的删除器 |
alloc | - | 用于分配内部使用的数据的分配器 |
r | - | 要对其共享所有权或从中获取所有权的另一智能指针 |
异常
3) 如果无法获取所需的额外内存则抛出 std::bad_alloc。可能为其他错误抛出由实现定义的异常。当发生异常时,若
T
不是数组类型则调用适用的 delete-表达式 (delete ptr,否则调用 delete[] ptr。12) 如果无法获取所需的额外内存则抛出 std::bad_alloc。可能为其他错误抛出由实现定义的异常。发生异常时构造函数没有效果。
13) 如果抛出了异常,则构造函数没有效果。
示例
本节未完成 原因:暂无示例 |
参阅
创建管理一个新对象的共享指针 (函数模板) | |
创建管理一个用分配器分配的新对象的共享指针 (函数模板) |