std::experimental::shared_ptr<T>:: 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
,这些指针指向需要管理的对象。
为便于下文描述,当满足以下任一条件时,指针类型
Y*
被称为与指针类型
T*
兼容:若
Y*
可转换为
T*
,或
Y
是数组类型
U[N]
且
T
为
U cv []
(其中 cv 为某组 cv 限定符)。
shared_ptr
,即空
shared_ptr
。
shared_ptr
。若
T
是数组类型
U[N]
,则
Y(*)[N]
必须可转换为
T*
。若
T
是数组类型
U[]
,则
Y(*)[]
必须可转换为
T*
。否则,
Y*
必须可转换为
T*
。此外:
T
不是数组类型,则为
delete ptr
;若
T
是数组类型,则为
delete
[
]
ptr
)作为删除器。
Y
必须是完整类型。该 delete 表达式必须格式正确、具有明确定义的行为且不抛出任何异常。
Deleter
必须满足
CopyConstructible
要求,且其拷贝构造函数和析构函数不得抛出异常。
shared_ptr
。即使该
shared_ptr
是组中最后一个离开作用域的,它也会调用由
r
最初管理的对象的析构函数。但对此调用
get()
将始终返回
ptr
的副本。程序员有责任确保该
ptr
在此 shared_ptr 存续期间保持有效,例如在典型使用场景中:
ptr
是由
r
管理的对象的成员,或是
r.
get
(
)
的别名(如下行转换)。
shared_ptr
。若
r
未管理任何对象,则
*
this
亦不管理任何对象。当
Y*
与
T*
不兼容时,该模板重载不参与重载决议。
shared_ptr
。构造完成后,
*
this
包含
r
先前状态的副本,而
r
变为空。若
Y*
与
T*
不
兼容
,则该模板重载不参与重载决议。
shared_ptr
。
Y*
必须与
T*
兼容。注意
r.
lock
(
)
可用于相同目的:区别在于当参数为空时,该构造函数会抛出异常,而
weak_ptr
<
T
>
::
lock
(
)
在这种情况下会构造一个空的
shared_ptr
。
shared_ptr
。
Y*
必须可转换为
T*
。构造完成后,
r
变为空。
shared_ptr
。与
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 | - | 用于共享所有权或获取所有权的另一个智能指针 |
异常
T
不是数组类型时为
delete ptr
,否则为
delete
[
]
ptr
)。
示例
|
本节内容不完整
原因:缺少示例 |
参见
|
创建管理新对象的共享指针
(函数模板) |
|
|
创建使用分配器分配新对象的共享指针
(函数模板) |