命名空间
变体
操作

std::out_ptr_t

来自 cppreference.com
< cpp‎ | memory
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三向比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



 
 
定义在头文件 <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* 对象,其中 Pointervoid* 对象通常会公开给外部函数以进行重新初始化。

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

内容

[edit] 模板参数

Smart - 要调整的对象的类型(通常是智能指针)
Pointer - 外部函数写入其结果的对象的类型(通常是原始指针)
Args... - 捕获的用于重置调整后对象的参数的类型
类型要求
-
Pointer 必须满足 NullablePointer 的要求。
-
如果 Smartstd::shared_ptr 特化,而 sizeof...(Args) == 0,则程序格式错误。

[edit] 特化

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

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

[edit] 成员函数

构造 out_ptr_t
(公有成员函数)
operator=
[已删除](C++23)
out_ptr_t 不可赋值
(公有成员函数)
重置调整后的智能指针
(公有成员函数)
out_ptr_t 转换为输出存储空间的地址
(公有成员函数)

[edit] 非成员函数

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

功能测试 Std 特性
__cpp_lib_out_ptr 202106L (C++23) std::out_ptrstd::inout_ptr
202311L (C++26) 独立的 std::out_ptrstd::inout_ptr

[编辑] 例子

[编辑] 参见

与外部指针设置器交互,从智能指针获取初始指针值,并在销毁时重置它。
(类模板) [编辑]
具有唯一对象所有权语义的智能指针。
(类模板) [编辑]
具有共享对象所有权语义的智能指针。
(类模板) [编辑]