std:: inout_ptr_t
|
定义于头文件
<memory>
|
||
|
template
<
class
Smart,
class
Pointer,
class
...
Args
>
class inout_ptr_t ; |
(C++23 起) | |
inout_ptr_t
用于适配智能指针等类型,以便与通过
Pointer*
(通常为某种对象类型
T
的
T**
)或
void
**
参数重置所有权的外部函数交互。
inout_ptr_t
在构造时捕获额外参数,为前述外部函数访问的结果提供存储空间,释放被适配的
Smart
对象持有的所有权,并在其销毁时最终使用结果和捕获的参数重置被适配的
Smart
对象。
inout_ptr_t
的行为表现如同持有以下非静态数据成员:
-
一个
Smart&引用,在构造时绑定到被适配对象, -
对于
Args...中的每个T,存在一个类型为T的成员,该成员在构造时捕获参数并在析构时用于重置操作,以及 -
一个适合存储
Pointer并提供 void * 对象的成员子对象,其中Pointer或 void * 对象通常暴露给外部函数用于所有权重置。
如果
Smart
不是指针类型,则最多对适配对象调用一次
release
(
)
。实现可以在构造函数中调用
release
(
)
,或在析构函数中重置前(当
Pointer
值非空时)调用。
用户可以通过在
Args...
中分别指定对象类型或引用类型,来控制每个重置参数是按值捕获还是按引用捕获。
目录 |
模板参数
| Smart | - | 要适配的对象类型(通常为智能指针) |
| Pointer | - | 外部函数访问用于所有权重置的对象类型(通常为原始指针) |
| Args... | - | 用于重置适配对象的捕获参数类型 |
| 类型要求 | ||
-
Pointer
必须满足
NullablePointer
的要求。
|
||
-
Smart
是
std::shared_ptr
特化则程序非良构。
|
||
特化
与标准库中的大多数类模板不同,
inout_ptr_t
的
程序定义特化
若依赖于至少一个
程序定义类型
,则无需满足主模板的要求。
此许可证允许程序定义的专门化将存储在非标准智能指针内的原始指针暴露给外部函数。
成员函数
|
(C++23)
|
构造
inout_ptr_t
对象
(公开成员函数) |
|
operator=
[deleted]
(C++23)
|
inout_ptr_t
不可赋值
(公开成员函数) |
|
(C++23)
|
在释放所有权后重置被适配的智能指针
(公开成员函数) |
将
inout_ptr_t
转换为输出存储地址
(公开成员函数) |
非成员函数
|
(C++23)
|
创建带有关联智能指针和重置参数的
inout_ptr_t
(函数模板) |
注释
inout_ptr_t
要求外部函数释放指针所指向的
Pointer
值所代表的所有权,然后重新初始化该指针。由于此操作需要独占所有权,因此禁止与
std::shared_ptr
一起使用。
inout_ptr_t
的典型用法是通过
std::inout_ptr
创建其临时对象,这会立即重置被适配的智能指针。例如,给定一个声明为
int
foreign_resetter
(
T
**
)
;
的设置函数和一个相应类型的智能指针
std::
unique_ptr
<
T, D
>
up
;
,
if (int ec = foreign_resetter(std::inout_ptr(up))) return ec;
大致相当于
T *raw_p = up.get(); up.release(); int ec = foreign_resetter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
不建议创建具有非自动
存储期
的
inout_ptr_t
对象,因为此类代码很可能产生悬空引用并在析构时导致未定义行为。
捕获的参数通常被打包到
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)
|
具有共享对象所有权语义的智能指针
(类模板) |