std:: out_ptr
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Non-member functions | ||||
|
out_ptr
|
|
定义于头文件
<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_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(); // 对数据库进行操作... } { // 同上,但使用 std::shared_ptr std::shared_ptr<sqlite3> sp; sqlite3_open(":memory:", std::out_ptr(sp, close_db)); sqlite3* db = sp.get(); // 对数据库进行操作... } }
参见
|
(C++23)
|
创建带有关联智能指针和重置参数的
inout_ptr_t
(函数模板) |
|
(C++14)
(C++20)
|
创建管理新对象的独占指针
(函数模板) |
|
创建管理新对象的共享指针
(函数模板) |