std::out_ptr_t
定义在头文件 <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* 对象,其中Pointer
或 void* 对象通常会公开给外部函数以进行重新初始化。
用户可以通过分别在 Args...
中指定对象类型或引用类型来控制是否通过复制或通过引用捕获每个用于重置的参数。
内容 |
[edit] 模板参数
Smart | - | 要调整的对象的类型(通常是智能指针) |
Pointer | - | 外部函数写入其结果的对象的类型(通常是原始指针) |
Args... | - | 捕获的用于重置调整后对象的参数的类型 |
类型要求 | ||
-Pointer 必须满足 NullablePointer 的要求。 | ||
-如果 Smart 是 std::shared_ptr 特化,而 sizeof...(Args) == 0,则程序格式错误。 |
[edit] 特化
与标准库中的大多数类模板不同,out_ptr_t
的至少依赖于一个 程序定义类型 的 程序定义特化 不必满足主模板的要求。
此许可证允许程序定义的特化将存储在非标准智能指针内的原始指针公开给外部函数。
[edit] 成员函数
(C++23) |
构造 out_ptr_t (公有成员函数) |
operator= [已删除](C++23) |
out_ptr_t 不可赋值(公有成员函数) |
(C++23) |
重置调整后的智能指针 (公有成员函数) |
将 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...> 中。实现可以使用不同的机制来提供它们需要持有的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 |
[编辑] 例子
本节内容不完整 原因: 无例子 |
[编辑] 参见
(C++23) |
与外部指针设置器交互,从智能指针获取初始指针值,并在销毁时重置它。 (类模板) |
(C++11) |
具有唯一对象所有权语义的智能指针。 (类模板) |
(C++11) |
具有共享对象所有权语义的智能指针。 (类模板) |