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
值不为 null 的情况下,在析构函数中重置之前调用。
用户可以通过在 Args...
中分别指定对象类型或引用类型,来控制是否按值或按引用捕获用于重置的每个参数。
内容 |
[编辑] 模板参数
Smart | - | 要调整的对象的类型(通常是智能指针) |
Pointer | - | 外部函数访问以重置所有权的对象的类型(通常是原始指针) |
Args... | - | 用于重置已调整对象被捕获的参数的类型 |
类型要求 | ||
-Pointer 必须满足 NullablePointer 的要求。 | ||
-如果 Smart 是 std::shared_ptr 特化,则程序格式不正确。 |
[编辑] 特化
与标准库中的大多数类模板不同,inout_ptr_t
的 程序定义的特化(至少依赖于一个 程序定义的类型)不需要满足主模板的要求。
此许可允许程序定义的特化将存储在非标准智能指针中的原始指针公开给外部函数。
[编辑] 成员函数
(C++23) |
构造一个 inout_ptr_t (公有成员函数) |
operator= [已删除](C++23) |
inout_ptr_t 不可赋值(公有成员函数) |
(C++23) |
在释放其所有权后重置已调整的智能指针 (公有成员函数) |
将 inout_ptr_t 转换为输出存储空间的地址(公有成员函数) |
[edit] 非成员函数
(C++23) |
创建带有关联智能指针和重置参数的inout_ptr_t 。(函数模板) |
[edit] 备注
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* 对象。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_out_ptr |
202106L | (C++23) | std::out_ptr ,std::inout_ptr |
202311L | (C++26) | 独立的 std::out_ptr 和 std::inout_ptr |
[edit] 示例
本节尚未完善 原因:没有示例 |
[edit] 另请参阅
(C++23) |
与外部指针设置器交互,并在销毁时重置智能指针 (类模板) |
(C++11) |
具有唯一对象所有权语义的智能指针 (类模板) |
(C++11) |
具有共享对象所有权语义的智能指针 (类模板) |