std::out_ptr(3)
π¦ std::out_ptr(3) π¦
Manual-name moment: this page lives in the C++ Standard Libary manual β yes, bestie, that's the manual name from the header folded in near the top, not the whole header line copied. π
β¨ NAME β¨
std::out_ptr - std::out_ptr β periodt, that's the NAME section. Self-titled icon behavior, no cap. π
πΈ Synopsis πΈ
Defined in header <memory>
template< class Pointer = void, class Smart, class... Args > (since C++23)
auto out_ptr( Smart& s, Args&&... args );
It returns an std::out_ptr_t with deduced template arguments that captures arguments for resetting by reference. π
The program is ill-formed if construction of the return value (see below) is ill-formed. Keep that in your notes, bestie β it's giving βcompiler said noβ energy.
π Parameters π
sβ the object (typically a smart pointer) to adapt. Main character energy: it's the thing getting adapted, fr fr.args...β the arguments for resetting to capture. All the resetting lore goes here.
π Return value π
The return value is:
std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...)
...where P is chosen like this, in order:
Pointer, ifPointeris not same asvoid. Otherwise,Smart::pointer, if it is valid and denotes a type. Otherwise,Smart::element_type*, ifSmart::element_typeis valid and denotes a type. Otherwise,std::pointer_traits<Smart>::element_type*.
π¦ Notes π¦
Users may specify the template argument for the template parameter Pointer, in order to interoperate with foreign functions that take a Pointer*. That's the Pointer-slot lore, iykyk. β¨
As all arguments for resetting are captured by reference, the returned out_ptr_t should be a temporary object destroyed at the end of the full-expression containing the call to the foreign function, in order to avoid dangling references. This is the serious part, bestie β do not let it hang around like an unread group chat. π
Feature-test macro tea β:
__cpp_lib_out_ptrβ value202106L, stdC++23, feature:std::out_ptr,std::inout_ptr.__cpp_lib_out_ptrβ value202311L, stdC++26, feature: freestandingstd::out_ptrandstd::inout_ptr.
π Example π
Use std::out_ptr to adapt a smart pointer for sqlite3_open, which expects a sqlite3** as an out parameter. Slay, foreign-function interop. π§
// Run this code
#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 ...
}
}
π See also π
inout_ptr(C++23) β creates aninout_ptr_twith an associated smart pointer and resetting arguments (function template).make_unique(C++14) β creates a unique pointer that manages a new object (function template).make_unique_for_overwrite(C++20) β creates a unique pointer that manages a new object (function template).make_sharedβ creates a shared pointer that manages a new object (function template).make_shared_for_overwrite(C++20) β creates a shared pointer that manages a new object (function template).
Okay bestie, that's the page. Footer tea for the very end: source/version http://cppreference.com, date 2024.06.10, page std::out_ptr(3) β mwah πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms