std::out_ptr_t

From cppreference.com
< cpp‎ | memory
Memory management library
(exposition only*)
Uninitialized memory algorithms
(C++17)
(C++17)
(C++17)
(C++20)
Constrained uninitialized
memory algorithms
(C++20)
C Library

Allocators
(C++11)
(C++11)
Memory resources
Garbage collection support
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
Uninitialized storage
(until C++20*)
(until C++20*)
(until C++20*)
Explicit lifetime management
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 T in Args..., a member of type T, which is an argument captured on construction and used for resetting while destruction, and
  • a member subobject that suitable for storing a Pointer within it and providing a void* object, where the Pointer or 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)
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

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)