命名空间
变体
操作

std::inout_ptr_t

来自 cppreference.cn
< cpp‎ | 内存
 
 
内存管理库
(仅作说明*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
内存资源
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化存储
(直到 C++20*)
(直到 C++20*)
显式生命周期管理
 
 
定义于头文件 <memory>
template< class Smart, class Pointer, class... Args >
class inout_ptr_t;
(C++23 起)

inout_ptr_t 用于适配智能指针等类型,使其能够与通过 Pointer*(通常是某些对象类型 TT**)或 void** 参数重置所有权的外部函数协同工作。

inout_ptr_t 在构造时捕获额外参数,为上述外部函数访问的结果提供存储,释放被适配的 Smart 对象所持有的所有权,最后在销毁时用结果和捕获的参数重置被适配的 Smart 对象。

inout_ptr_t 的行为就像它持有以下非静态数据成员:

  • 一个 Smart& 引用,在构造时绑定到被适配的对象,
  • 对于 Args... 中的每个 T,一个类型为 T 的成员,它是在构造时捕获并在销毁时用于重置的参数,以及
  • 一个适合在其内部存储 Pointer 并提供 void* 对象的成员子对象,其中 Pointervoid* 对象通常暴露给外部函数以重置所有权。

如果 Smart 不是指针类型,则在被适配的对象上最多调用一次 release()。如果 Pointer 的值不为空,实现可以在构造函数中或在析构函数中重置之前调用 release()

用户可以通过在 Args... 中分别指定对象类型或引用类型来控制每个重置参数是以复制还是以引用方式捕获。

目录

[edit] 模板参数

Smart - 要适配的对象的类型(通常是智能指针)
指针 - 外部函数访问的对象的类型(通常是原始指针),用于重置所有权
Args... - 用于重置被适配对象的捕获参数的类型
类型要求
-
Pointer 必须满足 NullablePointer 的要求。
-
如果 Smartstd::shared_ptr 特化,则程序是非良构的。

[edit] 特化

与标准库中的大多数类模板不同,依赖于至少一个程序定义类型inout_ptr_t 程序定义特化无需满足主模板的要求。

此许可允许程序定义特化将存储在非标准智能指针中的原始指针暴露给外部函数。

[edit] 成员函数

构造一个 inout_ptr_t
(公开成员函数)
operator=
[已删除](C++23)
inout_ptr_t 不可赋值
(公开成员函数)
释放所有权后重置被适配的智能指针
(公开成员函数)
inout_ptr_t 转换为输出存储的地址
(公开成员函数)

[edit] 非成员函数

(C++23)
创建一个带有关联智能指针和重置参数的 inout_ptr_t
(函数模板) [edit]

[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...> 中。实现可以使用不同的机制来提供它们需要持有的 Pointervoid* 对象。


特性测试 标准 特性
__cpp_lib_out_ptr 202106L (C++23) std::out_ptr, std::inout_ptr
202311L (C++26) 独立的 std::out_ptrstd::inout_ptr

[edit] 示例

[edit] 参阅

(C++23)
与外部指针设置器交互,并在销毁时重置智能指针
(类模板) [edit]
具有唯一对象所有权语义的智能指针
(类模板) [edit]
具有共享对象所有权语义的智能指针
(类模板) [edit]