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

来自cppreference.com
 
 
实验性
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
实验性非 TS 功能特性
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
 
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) ,且其复制构造函数和析构函数不能抛出异常。
6,7)(4,5) 相同,但此外还使用 alloc 的副本来分配内部使用的数据。Alloc 必须为分配器 (Allocator) ,且其复制构造函数和析构函数不能抛出异常。
8) 别名构造函数:构造与 {{c|r} 共享所有权的 shared_ptr,但持有无关且未管理的指针 ptr。即便此 shared_ptr 是离开作用域组中最后一个,它仍将为原来由 r 管理的对象调用析构函数。不过,在其上调用 get() 将总是返回 ptr 的副本。程序员有责任确保,只要这个 shared_ptr 存在,ptr 就保持有效,比如在 ptrr 所管理的对象的成员,或者为 r.get() 的别名(比如经向下转型)等典型使用情景。
9) 构造共享 r 所管理对象的所有权的 shared_ptr。如果 r 并不管理对象,则 *this 也不管理对象。如果 Y*兼容于 T*,则模板重载不参与重载决议。
10)r 移动构造 shared_ptr。经过构造后,*this 含义 r 之前状态的副本,r 为空。如果 Y*兼容于 T*,则模板重载不参与重载决议。
11) 构造共享 r 所管理对象的所有权的 shared_ptrY* 必须兼容于 T*。注意 r.lock() 可以用于相同目的:其差别在于此构造函数在实参为空时会抛出异常,而 weak_ptr<T>::lock() 在此情况下构造空 shared_ptr
12) 构造存储并拥有 r 之前拥有的对象的 shared_ptrY* 必须可以转换为 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
4-7) 如果无法获取所需的额外内存则抛出 std::bad_alloc。可能为其他错误抛出由实现定义的异常。当发生异常时调用 d(ptr)
11) 如果 r.expired() == true 则抛出 std::bad_weak_ptr。这种情况下构造函数没有效果。
12) 如果无法获取所需的额外内存则抛出 std::bad_alloc。可能为其他错误抛出由实现定义的异常。发生异常时构造函数没有效果。
13) 如果抛出了异常,则构造函数没有效果。

示例

参阅

创建管理一个新对象的共享指针
(函数模板)
创建管理一个用分配器分配的新对象的共享指针
(函数模板)