std:: out_ptr_t
|
定义于头文件
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class out_ptr_t ; |
(C++23 起) | |
out_ptr_t
用于适配诸如智能指针等类型,以适用于通过
Pointer*
(通常为某种对象类型
T
的
T**
)或
void
**
参数输出结果的外部函数。
out_ptr_t
在构造时捕获额外参数,为前述外部函数写入的结果提供存储空间,并在其销毁时使用结果及捕获的参数重置被适配的
Smart
对象。
out_ptr_t
的行为表现如同持有以下非静态数据成员:
-
一个
Smart&引用,在构造时绑定到被适配对象, -
对于
Args...中的每个T,都有一个类型为T的成员,该成员在构造时捕获参数并在销毁时用于重置操作,以及 -
一个适合存储
Pointer并提供 void * 对象的成员子对象,其中Pointer或 void * 对象通常暴露给外部函数用于重新初始化。
用户可以通过在
Args...
中分别指定对象类型或引用类型,来控制每个重置参数是按值捕获还是按引用捕获。
目录 |
模板参数
| Smart | - | 待适配对象的类型(通常为智能指针) |
| Pointer | - | 外部函数写入结果的目标对象类型(通常为原始指针) |
| Args... | - | 用于重置适配对象的捕获参数类型 |
| 类型要求 | ||
-
Pointer
必须满足
NullablePointer
要求。
|
||
-
Smart
是
std::shared_ptr
特化且
sizeof...
(
Args
)
==
0
,则程序非良构。
|
||
特化
与标准库中的大多数类模板不同,
out_ptr_t
的
程序定义特化
若依赖于至少一个
程序定义类型
,则无需满足主模板的要求。
此许可证允许程序定义的专门化将存储在非标准智能指针内的原始指针暴露给外部函数。
成员函数
|
(C++23)
|
构造
out_ptr_t
对象
(公开成员函数) |
|
operator=
[deleted]
(C++23)
|
out_ptr_t
不可赋值
(公开成员函数) |
|
(C++23)
|
重置被适配的智能指针
(公开成员函数) |
将
out_ptr_t
转换为输出存储地址
(公开成员函数) |
非成员函数
|
(C++23)
|
创建带有关联智能指针和重置参数的
out_ptr_t
(函数模板) |
注释
out_ptr_t
预期外部函数不会使用指向的
Pointer
的值,仅会重新初始化它。适配前智能指针的值不会被使用。
out_ptr_t
的典型用法是通过
std::out_ptr
创建其临时对象,这会立即重置被适配的智能指针。例如,给定一个设置函数和相应类型的智能指针,分别声明为
int
foreign_setter
(
T
**
)
;
和
std::
unique_ptr
<
T, D
>
up
;
,
int foreign_setter(T**); std::unique_ptr<T, D> up; if (int ec = foreign_setter(std::out_ptr(up))) return ec;
大致相当于
int foreign_setter(T**); std::unique_ptr<T, D> up; T* raw_p{}; int ec = foreign_setter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
不建议创建具有除
自动存储期
之外存储期的
out_ptr_t
对象,因为此类代码很可能产生悬空引用并在析构时导致未定义行为。
out_ptr_t
禁止在未指定删除器的情况下重置
std::shared_ptr
的用法,因为这会调用
std::shared_ptr::reset
并在后续替换自定义删除器。
捕获的参数通常被打包到
std::
tuple
<
Args...
>
中。实现可能采用不同机制来提供它们需要持有的
Pointer
或
void
*
对象。
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_out_ptr
|
202106L
|
(C++23) |
std::out_ptr
,
std::inout_ptr
|
202311L
|
(C++26) |
独立环境下的
std::out_ptr
和
std::inout_ptr
|
示例
|
本节内容不完整
原因:缺少示例 |
参见
|
(C++23)
|
与外部指针设置器交互,从智能指针获取初始指针值,并在析构时重置指针
(类模板) |
|
(C++11)
|
具有唯一对象所有权语义的智能指针
(类模板) |
|
(C++11)
|
具有共享对象所有权语义的智能指针
(类模板) |