std::out_ptr_t
来自cppreference.com
在标头 <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...
中分别指定对象类型或引用类型,控制每个参数是按复制还是按引用捕获。
模板形参
Smart | - | 要适配的对象(常为智能指针)的类型 |
Pointer | - | 外来函数写入其结果所用的对象(常为裸指针)的类型 |
Args... | - | 用于重设适配的对象的捕获实参的类型 |
类型要求 | ||
-Pointer 必须符合可空指针 (NullablePointer) 的要求。
| ||
-若 Smart 为 std::shared_ptr 特化且 sizeof...(Args) == 0 则程序非良构。
|
特化
不同于标准库中的大多数类模板,依赖于至少一个程序定义类型的 out_ptr_t
程序定义特化不需要符合对主模板的要求。
此许可允许程序定义特化将存储于非标准智能指针内的裸指针暴露给外来函数。
成员函数
(C++23) |
构造 out_ptr_t (公开成员函数) |
operator= [被删除](C++23) |
out_ptr_t 不可赋值 (公开成员函数) |
(C++23) |
重设适配的智能指针 (公开成员函数) |
转换 out_ptr_t 为用于输出的存储的地址 (公开成员函数) |
非成员函数
(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; 声明,
if (int ec = foreign_setter(std::out_ptr(up)) { return ec; }
粗略地等价于
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* 对象。
示例
本节未完成 原因:暂无示例 |
参阅
(C++23) |
与外来指针设置器交互,从智能指针获得初始指针值,并在析构时重设它 (类模板) |
(C++11) |
拥有独有对象所有权语义的智能指针 (类模板) |
(C++11) |
拥有共享对象所有权语义的智能指针 (类模板) |