Namespaces
Variants

std:: inout_ptr_t

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <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 程序定义特化 若依赖于至少一个 程序定义类型 ,则无需满足主模板的要求。

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

成员函数

构造 inout_ptr_t 对象
(公开成员函数)
operator=
[deleted] (C++23)
inout_ptr_t 不可赋值
(公开成员函数)
在释放所有权后重置被适配的智能指针
(公开成员函数)
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)
具有共享对象所有权语义的智能指针
(类模板)