std::out_ptr

来自cppreference.com
< cpp‎ | memory‎ | out ptr t
 
 
内存管理库
(仅用于阐述*)
分配器
未初始化内存算法
受约束的未初始化内存算法
内存资源
未初始化存储 (C++20 前)
(C++17 弃用)
(C++17 弃用)

垃圾收集器支持 (C++23 前)
(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 Pointer = void, class Smart, class... Args >
auto out_ptr( Smart& s, Args&&... args );
(C++23 起)

返回拥有被推导模板实参的 std::out_ptr_t,按引用绑定重设用的实参。

若返回值(见后述)的构造非良构则程序非良构。

目录

[编辑] 参数

s - 要适配的对象(常为智能指针)
args... - 要捕获的用于重设的实参

[编辑] 返回值

std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...),其中 P

  • Pointer,若 Pointer 不是 void 类型,
  • 否则为 Smart::pointer,若它合法并指代类型,
  • 否则为 Smart::element_type*,若 Smart::element_type 合法并指代类型,
  • 否则为 std::pointer_traits<Smart>::element_type*

[编辑] 注解

用户可对模板形参 Pointer 指定模板实参,以与接收 Pointer* 的外来函数交互。

由于所有实参都按引用捕获,返回的 out_ptr_t 应为在含有外来函数调用的全表达式结尾销毁的临时对象,以避免悬垂引用。

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

[编辑] 示例

使用 std::out_ptr 适配一个用于 sqlite3_open 的智能指针,它预期一个 sqlite3** 作为其输出形参。

#include <memory>
#include <sqlite3.h>
 
int main()
{
    auto close_db = [](sqlite3* db) { sqlite3_close(db); };
 
    {
        // 打开一个内存数据库,并以一个 std::unique_ptr 管理其生存期
        std::unique_ptr<sqlite3, decltype(close_db)> up;
        sqlite3_open(":memory:", std::out_ptr(up));
 
        sqlite3* db = up.get();
        // 用 db 做些工作 ...
    }
    {
        // 同上,但使用 std::shared_ptr
        std::shared_ptr<sqlite3> sp;
        sqlite3_open(":memory:", std::out_ptr(sp, close_db));
 
        sqlite3* db = sp.get();
        // 用 db 做些工作 ...
    }
}

[编辑] 参阅

(C++23)
以关联的智能指针和重设参数创建 inout_ptr_t
(函数模板) [编辑]
创建管理一个新对象的独占指针
(函数模板) [编辑]
创建管理一个新对象的共享指针
(函数模板) [编辑]