std::out_ptr
来自 cppreference.cn
定义于头文件 <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**
作为 out 参数。
运行此代码
#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) |
创建一个管理新对象的 unique pointer (函数模板) |
创建一个管理新对象的 shared pointer (函数模板) |