std::out_ptr
来自cppreference.com
| 在标头 <memory> 定义
|
||
| |
(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_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); };
{
// 打开一个内存数据库,并以一个 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 (函数模板) |
(C++14)(C++20) |
创建管理一个新对象的独占指针 (函数模板) |
| 创建管理一个新对象的共享指针 (函数模板) |