std::out_ptr_t
Defined in header <memory>
|
||
|
template
<
class Smart, class Pointer, class... Args
>
class out_ptr_t; |
(since C++23) | |
out_ptr_t is used to adapt types such as smart pointers for foreign functions that output their results via a Pointer* (usually T** for some object type T) or void**
out_ptr_t captures additional arguments on construction, provides storage for the result to which such an aforementioned foreign function writes, and finally resets the adapted Smart
out_ptr_t behaves as if it holds following non-static data members:
- a
Smart&reference, which is bound to the adapted object on construction, - for every
TinArgs..., a member of typeT, which is an argument captured on construction and used for resetting while destruction, and - a member subobject that suitable for storing a
Pointerwithin it and providing a void* object, where thePointeror void*
Users can control whether each argument for resetting is captured by copy or by reference, by specifying an object type or a reference type in Args... respectively.
Template parameters
| Smart | - | the type of the object (typically a smart pointer) to adapt |
| Pointer | - | type of the object (typically a raw pointer) to which a foreign function writes its result |
| Args... | - | type of captured arguments used for resetting the adapted object |
| Type requirements | ||
-
Pointer must meet the requirements of NullablePointer
|
||
-The program is ill-formed if Smart is a std::shared_ptr specialization and sizeof...(Args) == 0
|
||
Specializations
Unlike most class templates in the standard library, program-defined specializations of out_ptr_t that depend on at least one program-defined type
This license allows a program-defined specialization to expose the raw pointer stored within a non-standard smart pointer to foreign functions.
Member functions
|
(C++23)
|
constructs an out_ptr_t (public member function) |
|
operator= [deleted](C++23) |
out_ptr_t is not assignable (public member function) |
|
(C++23)
|
resets the adapted smart pointer (public member function) |
|
(C++23)
|
converts the out_ptr_t to the address of the storage for output (public member function) |
Non-member functions
|
(C++23)
|
creates an out_ptr_t with an associated smart pointer and resetting arguments (function template) |
Notes
out_ptr_t expects that the foreign functions do not used the value of the pointed-to Pointer, and only re-initialize it. The value of the smart pointer before adaption is not used.
The typical usage of out_ptr_t is creating its temporary objects by std::out_ptr, which resets the adapted smart pointer immediately. E.g. given a setter function and a smart pointer of appropriate type declared with int foreign_setter(T**); and
std::unique_ptr<T, D> up;
int foreign_setter(T**); std::unique_ptr<T, D> up; if (int ec = foreign_setter(std::out_ptr(up))) return ec;
is roughly equivalent to
int foreign_setter(T**); std::unique_ptr<T, D> up; T* raw_p{}; int ec = foreign_setter(&raw_p); up.reset(raw_p); if (ec != 0) return ec;
It is not recommended to create an out_ptr_t object of a storage duration
out_ptr_t forbids the usage that would reset a std::shared_ptr without specifying a deleter, because it would call std::shared_ptr::reset
Captured arguments are typically packed into a
std::tuple
<Args...>
. Implementations may use different mechanism to provide the Pointer or void*
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_out_ptr |
202106L |
(C++23) | std::out_ptr, std::inout_ptr
|
202311L |
(C++26) | freestanding std::out_ptr and std::inout_ptr
|
Example
| This section is incomplete Reason: no example |
See also
|
(C++23)
|
interoperates with foreign pointer setters, obtains the initial pointer value from a smart pointer, and resets it on destruction (class template) |
|
(C++11)
|
smart pointer with unique object ownership semantics (class template) |
|
(C++11)
|
smart pointer with shared object ownership semantics (class template) |