std::out_ptr
来自 cppreference.com
定义在头文件 <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
应该是一个临时对象,在包含对外部函数的调用的完整表达式结束时销毁,以避免悬空引用。
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_out_ptr |
202106L | (C++23) | std::out_ptr ,std::inout_ptr |
202311L | (C++26) | 独立 std::out_ptr 和 std::inout_ptr |
[编辑] 示例
使用 std::out_ptr
适配一个智能指针,以用于 sqlite3_open
,它期望 sqlite3**
作为输出参数。
运行此代码
#include <memory> #include <sqlite3.h> int main() { auto close_db = [](sqlite3* db) { sqlite3_close(db); }; { // open an in-memory database, and manage its lifetime with std::unique_ptr std::unique_ptr<sqlite3, decltype(close_db)> up; sqlite3_open(":memory:", std::out_ptr(up)); sqlite3* db = up.get(); // do something with db ... } { // same as above, but use a std::shared_ptr std::shared_ptr<sqlite3> sp; sqlite3_open(":memory:", std::out_ptr(sp, close_db)); sqlite3* db = sp.get(); // do something with db ... } }
[编辑] 另请参见
(C++23) |
创建具有关联智能指针和重置参数的 inout_ptr_t (函数模板) |
(C++14)(C++20) |
创建一个管理新对象的唯一指针 (函数模板) |
创建一个管理新对象的共享指针 (函数模板) |